有可能在C#中使用分支预测提示吗?
例如,我知道它是为GCC定义的,并在Linux内核中使用为: #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) 如果在C#中没有什么可能的话,是手动重新排序的最佳替代品,将最有可能的情况放在首位吗?是否还有其他方法可以根据这种类型的外部知识进行优化? 在相关的说明上,CLR知道如何识别后卫条款,并假设将采取替代分支,从而使此优化不合适,不适合在后卫clase上使用,正确? (请注意,我意识到这可能是一个小优化;我只是对学术目的感兴趣.) 解决方案 简短答案:否. 更长的答案:在大多数情况下,您实际上不需要.您 can 通过更改语句中的逻辑来提供提示.这样的性能工具,例如内置在较高(且更昂贵)的Visual Studio中的工具,因为您可以捕获错误预测的分支机构计数器.我意识到这是出于学术目的,但是很高兴知道Jit
0 2024-04-17
编程技术问答社区
创建一个恒定但局部的数组
有时我需要一个用于单个方法的硬编码查找表. 我可以创建这样的数组 在方法本身中本地 班级内部的静态 第一种情况的示例: public int Convert(int i) { int[] lookup = new[] {1, 2, 4, 8, 16, 32, 666, /*...*/ }; return lookup[i]; } 据我所知,每次执行此方法时,.NET引擎都会创建一个新的查找数组.这是正确的,还是吉特足够聪明,可以缓存并重复使用呼叫之间的数组? 我假定答案是否定的,所以如果我想确保在呼叫之间缓存该数组,一种方法是使其static: 第二种情况的示例: private static readonly int[] lookup = new[] { 1, 2, 4, 8, 16, 32, 666, /*...*/ }; public int Convert(int i) { return lookup[i];
0 2024-04-17
编程技术问答社区
雷斯哈珀:可能的IEnumerable的多重枚举
我正在使用新的Resharper版本6.在我的代码中的几个地方,它强调了一些文本,并警告我可能会有一个可能的多重枚举.. 我理解这意味着什么,并且在适当的情况下采取了建议,但是在某些情况下,我不确定这实际上是一件大事. 喜欢以下代码: var properties = Context.ObjectStateManager.GetObjectStateEntry(this).GetModifiedProperties(); if (properties.Contains("Property1") || properties.Contains("Property2") || properties.Contains("Property3")) { ... } 它在第二行上强调了properties的每一个提及,警告我多次对此表示枚举. 如果我将.ToList()添加到第1行的末尾(将properties从IEnumerable转到List
0 2024-04-17
编程技术问答社区
在.NET 4上,C# 'is'操作符能否在释放模式优化下受到影响?
下面是一个简单的测试固定装置.它在发行版构建中成功进行了调试构建和失败(VS2010,.NET4解决方案,x64): [TestFixture] public sealed class Test { [Test] public void TestChecker() { var checker = new Checker(); Assert.That(checker.IsDateTime(DateTime.Now), Is.True); } } public class Checker { public bool IsDateTime(object o) { return o is DateTime; } } 似乎代码优化造成了一些破坏.如果我在发行版中将其禁用,它也可以工作.这让我感到困惑.下面,我使用Ildasm拆卸了构建的两个版本: 调试IL: .metho
0 2024-04-17
编程技术问答社区
在.NET中是否有办法使用静态方法来获得文件的大小?
我知道获取文件大小的正常方法是使用fileInfo实例: using System.IO; class SizeGetter { public static long GetFileSize(string filename) { FileInfo fi = new FileInfo(filename); return fi.Length; } } 有没有一种方法可以使用静态方法创建FileInfo实例? 也许我每次想要一个文件大小时都试图过分ing创建一个新实例,但以尝试计算包含5000多个文件的目录的总大小.像GC一样进行了优化,不应该有一种方法可以做到这一点,而不必不必要地征税? 解决方案 不用担心.首先,.NET中的分配很便宜.其次,该对象将在Gen 0中,因此应在没有太多开销的情况下收集它. 其他解决方案 不用担心. 我找到了一个在.net中测量对象创建开销的人的博客文章( c#对象创建时间试验),事实证明,创建1
0 2024-04-17
编程技术问答社区
除了减少内存使用外,C#静态函数是否比非静态函数表现得更好?
我假设public或private static目标必须减少内存使用情况,因为在内存中只有一个静态目标的副本. 似乎是因为一种方法是静态的,该方法可能使该方法成为CLR编译器进一步优化的潜在点,而不是非静态功能的可能性.不过只是一个脆弱的理论,所以我来问大家. do static public或private方法提供了超出记忆使用量的增加的性能好处? (注意:我对谈论过早优化问题的答复不感兴趣.当然,这是我每天都遵循的合理建议,但这并不意味着有时不需要优化.(Double Natef!).允许我至少要放纵我的好奇心) 解决方案 来自静态类和静态类成员(C#编程指南)/a> 静态方法的调用会生成一个 在Microsoft中致电指令 中等语言(MSIL),而 对实例方法的调用生成 CallVirt指令,也 检查为空对象引用. 但是,大多数时候 两者之间的性能差异 并不重要. 其他解决方案 除了阿斯坦德所说的话外,您的问题表明对实例方法的误解.无论该函数
0 2024-04-17
编程技术问答社区
你是否使用过ngen.exe?
这里有人曾经使用过ngen吗?在哪里?为什么?是否有改进的性能?何时何地使用它? 解决方案 是的,我已经看到了性能的改进.我的测量表明,如果我也将组件放入GAC,因为我的组件都命名很强,它确实会提高启动性能.如果您的组件命名很强,则不使用GAC,NGEN将不会有任何区别.这样做的原因是,如果您有不在GAC中的强命名组件,则.NET运行时验证您的强命名汇编尚未通过从磁盘上加载整个托管组件来篡改您的命名的组件,以便它可以验证其范围NGEN的主要好处之一 对于我的应用程序来说,这不是一个不错的选择,因为我们依靠公司的共同组件(也很强).许多使用许多不同版本的产品使用了共同的组件,将它们放入GAC中意味着,如果我们的一个应用程序中没有说一个常见的组件的"使用特定版本",则它将加载GAC版本,而不管是什么版本正在执行目录中.我们认为Ngen的好处不值得冒险. 其他解决方案 我不日常使用它,但是它是由想要提高性能的工具使用的;例如,Paint.net在安装程序期间使用NGEN(
0 2024-04-17
编程技术问答社区
哪种方法最快:(int),Convert.ToInt32(x)或Int32.Parse(x)?
以下哪个代码是转换某些对象x? 的最佳/最佳实践 int myInt = (int)x; 或 int myInt = Convert.ToInt32(x); 或 int myInt = Int32.Parse(x); 或字符串'S' int myInt; Int32.TryParse(s, out myInt); 我很好奇哪些在具有转换中的方法的数据表中执行最快的数据类型,而不仅仅是ints.我只是以int为例. 编辑:这种情况是由于从数据表中添加信息而引起的. (int)仍会运作最快吗? 从某些测试中,当对象x = 123123123时,int执行最快,就像许多人所说的那样.当x是字符串时,解析运行最快(注意:铸造抛出异常).我真的很好奇的是,当值以以下方式检索值时,它们如何运行: foreach(DataRow row in someTable.Rows) { myInt = (int)row["some int val
0 2024-04-17
编程技术问答社区
需要优化计算正值和负值
我需要优化计算pos/neg值并按时间删除不合格值的代码. 我有带时标记的值队列. 我需要丢弃1ms旧的值,并计算负值和正值.这是伪代码 list l; v = q.dequeue(); deleteold(l, v.time); l.add(v); negcount = l.count(i => i.value i.value >= 0); if(negcount == 10) return -1; if(poscount == 10) return 1; 我需要在C#中使用最大速度工作的代码.无需坚持列表.实际上,欢迎用于neg和POS值分开的数组. 编辑:可能不安全的阵列将是最好的.有提示吗? 编辑:感谢您的头脑./p> 这是公平的代码: class Program { static int LEN = 10; static int LEN1 = 9;
0 2024-04-17
编程技术问答社区
如何用Span<T>和stackalloc来创建一个临时小列表
我正在阅读用C编写的某些代码的描述,该描述是由于在堆栈上分配了临时数组而不是用于非常热的循环中的堆积而提高速度. (被描述为类似于SBO优化).所讨论的对象类似于List,因为它只是一个数组,顶部具有一些基本的便利功能.它可以分配一小部分内存使用,如果列表超过了数组的大小,则在堆上分配一个新数组,复制数据并更新指针. 我想在C#中做同样的事情,但是我不确定如何完成它,因为我想将其保存在safe上下文中,因此我不能使用指针来更新数据参考它的扩展,Span没有隐含的铸件对int[].具体: stackalloc内存是在方法退出上发布的,因此我不确定是否有一种使用类似结构的简单方法,而不是给它一个跨度字段并在使用它在方法中创建它之后分配它. 如何在不更改面向公共的接口的情况下使用不同类型(SPAN和INT [])的备份字段之间进行整洁切换? 解决方案 我设法提出了一个解决方案,不确定它是否是最好的实现,但似乎有效.我也有几个替代方案. 注意:这对于提
0 2024-04-17
编程技术问答社区
巩固合并pdfs之间的字体 itextsharp C#
我需要将多个PDF合并在一起.我正在使用ItextSharp来创建所有PDF.我需要将PDF的大小减少到最低的大小.我知道每个PDF的字体正在复制.整个合并的PDF中是否只使用一组字体?例如,PDF1为2.8MB,PDF2为2.8 MB,我将它们合并在一起,约为5.7MB.我知道,这两个PDF都使用了相同的字体,但是即使在同一PDF中,该字体的数据也被引用. 我尝试使用将压缩属性设置为最佳压缩并设置完整压缩,并且几乎不会降低大小. 虽然当我通过Acrobat X Pro运行PDF并优化其将近90%+从160 MB降低到5 MB.用法审核说,在优化之前,其90%的PDF是字体. 现在是否可以合并合并PDF之间的字体? 解决方案 我的答案包括两个部分: 您不是在告诉我们如何合并PDF.希望您已经阅读官方文档,并且您正在使用PdfSmartCopy.如果没有,您做错了. PdfSmartCopy检查不同PDF的内容,并可能是冗余对象(例如重复使用的图像,Xobj
0 2024-04-17
编程技术问答社区
方法优化
我有一个空隙函数,其中有很多IF语句,并且所有这些语句都需要我,我真的无法删除任何内容.但是我觉得这样做可以做得更好.使用一些LINQ.Where,类或类似的东西.我想以最少的字符优化并表达void Smooth: void Smooth(ref int botChips, ref bool botTurn, Label botStatus, int name, int n, int r) { Random rand = new Random(); int rnd = rand.Next(1, 3); if (rounds == 0 || rounds == 1) { if (call
0 2024-04-17
编程技术问答社区
写入文件需要为大流量进行优化 第二部分
让任何人兴趣看看我来自哪里,您可以参考第1部分,但这不是必需的. 写文件需要针对繁忙的流量进行优化 下面是我编写的代码段,我为从经纪人API中捕获了一些财务刻度数据.该代码将不会出错.我需要优化代码,因为在高峰时段,ZF_TICKEVENT方法将每秒调用超过10000次.我使用MemoryStream保存数据,直到达到一定尺寸,然后将其输出到文本文件中. 代理API只是单线螺纹. void zf_TickEvent(object sender, ZenFire.TickEventArgs e) { outputString = string.Format("{0},{1},{2},{3},{4}\r\n", e.TimeStamp.ToString(timeFmt), e.Product.ToString(),
0 2024-04-17
编程技术问答社区
运行时优化中的UV解包
我正在尝试创建UVS @ Runtime,我使用的是一个框类型UVS(类似于3DS Max中的Box UVW),并基于面部方向的计算. 我知道创建运行时不是一个不错的选择,但我别无选择:(它在计算后保存了,所以我做了一次. ,但我花了40秒才能获得30000个顶点...太长 我的代码中是否有任何优化? . 如果您的代码有 public static void CreateUV(ref Mesh mesh) { int i = 0; Vector3 p = Vector3.up; Vector3 u = Vector3.Cross(p, Vector3.forward); if (Vector3.Dot(u, u)
0 2024-04-17
编程技术问答社区
使用列文斯坦距离优化两个大数据集的元素匹配(将每个元素与其他元素进行比较)。
我目前正在处理一个问题,以从列表中的另一个名为" ListB"的列表中找到最佳数据匹配.每当我找到" Lista"元素的匹配项,其中" ListB"中的任何元素具有70%或更高的信心和准确性,我都会从列表B中添加匹配的字符串,列表a中的字符串a tuple中我会进一步保存在数据库中. levenshtien算法给我一个数字,我将其与70的阈值进行比较,如果返回的值等于或大于70%的阈值,我会用" lista"的原始字符串元素附加. 如果" Lista"和" ListB"中的记录在数千个值之内,并且如果我将记录增加到一百万个,则需要大约一个小时来计算每种距离的距离,那么我为此过程编写的代码工作正常列表的元素A. 我需要优化大型数据集的过程.请告知我需要在哪里进行改进. 到目前为止,我的该过程的代码看起来像 public static PerformFuzzyMatch() { // Fetch the ListA & List B from S
0 2024-04-17
编程技术问答社区
我巩固金矿的算法的缺陷在哪里?
设置是,给定N对象的列表,例如 class Mine { public int Distance { get; set; } // from river public int Gold { get; set; } // in tons } 将黄金从一个地雷移动到另一个地雷的成本是 // helper function for cost of a move Func, int> MoveCost = (tuple) => Math.Abs(tuple.Item1.Distance - tuple.Item2.Distance) * tuple.Item1.Gold; 我想将黄金合并为K矿山. 我写了一种算法,多次认为它,并且不明白为什么它不起作用.希望我的评论会有所帮助.知道我出错了哪里吗? using System; using System.Collections.Gen
0 2024-04-17
编程技术问答社区
JIT拒绝内联微小方法
我错过了严重的优化,因为JIT不会嵌入我的许多方法. 例如,让我们有以下代码: static void Main(string[] args) { IsControl('\0'); } public static bool IsControl(char c) { return ((c >= 0 && c = 127 && c
0 2024-04-16
编程技术问答社区
如何提高window phone 8.1中GetThumbnailAsync方法的性能?
我编写一个函数以在窗口手机8.1中的文件夹上显示图像(假设我在此文件夹中有大约 60张图像).问题是函数getThumbNailAsync()需要很长时间当我创建流以获取bitmapimage时. 这是我的代码 //getFileInPicture is function get all file in picture folder List lstPicture = await getFileInPicture(); foreach (var file in lstPicture) { var thumbnail = await file.GetThumbnailAsync(Windows.Storage.FileProperties.ThumbnailMode.PicturesView,50); var bitmapImage = n
0 2024-04-16
编程技术问答社区
垃圾收集器在收集可达对象的实例属性或字段时的不明确行为
直到今天,我一直在想 的成员可触及的对象 也被认为是可触及的. 但是,今天我发现了一种在检查 Optimize Code 时为我们造成问题的行为,或者在 发布模式下执行了应用程序 .显然,发布模式也取决于代码优化.因此,似乎代码优化是这种行为的原因. 让我们看一下该代码: public class Demo { public Action myDelWithMethod = null; public Demo() { myDelWithMethod = new Action(Method); // ... Pass it to unmanaged library, which will save that delegate and execute during some lifetime // Check whether object is alive or not afte
0 2024-04-16
编程技术问答社区
在C#中对树进行微观优化迭代
我正在从事大规模数字处理项目.自开始以来,我一直在优化所有内容,因为我知道这将很重要.进行性能分析,我的代码在一个功能中花费了几乎40%的寿命 - 二进制树迭代器. public ScTreeNode GetNodeForState(int rootIndex, float[] inputs) { 0.2% ScTreeNode node = RootNodes[rootIndex].TreeNode; 24.6% while (node.BranchData != null) { 0.2% BranchNodeData b = node.BranchData; 0.5% node = b.Child2; 12.8% if (inputs[b.SplitInputIndex]
0 2024-04-16
编程技术问答社区