我正在编写一个应用程序,我需要以极低的处理器速度运行。应用程序在整个运行过程中以创造性的方式创建和销毁内存,并且工作得很好。什么编译器优化发生,所以我可以尝试构建到那个?
现有的一个技巧是CLR处理数组比列表快得多,所以如果你需要处理List中的大量元素,你可能最好调用ToArray()并处理它而不是调用ElementAt()一次又一次。
答案 0 :(得分:8)
构建系统,运行它,然后附加分析器以查看速度有多慢。然后使用Stack Overflow,Google和常识来加速这些领域。
最重要的是不要浪费时间加快实际无关紧要的事情,因此分析非常重要。
答案 1 :(得分:6)
你可能意味着高速,而不是低速。
语言错误。对于总体优化,您需要更低级别的东西。但是,大部分都不需要。
注意顺便说一句,您对数组和列表的指示是错误的...根据您选择的列表,链表,因此具有与数组不同的性能特征。但这不是CLR /运行时的事情。
除了StringBuilder之外 - 我的主要建议是:使用分析器。大多数人都试图通过速度变得聪明,但从不描述,因此在以后花费大量时间进行无用的优化 - 你得到的速度更快,但是更糟糕。首先找出应用程序实际花费时间的位置。
答案 2 :(得分:2)
如果您的应用程序中存在大量字符串操作,请使用StringBuilder而不是字符串。应用程序的性能将大大提高。
还用StringBuilder替换字符串连接(+运算符)。
特定于Windows Forms .NET,请关闭DataGridView.AutoSizeColumnsMode
和AutoSizeRowMode
。
答案 3 :(得分:2)
通常很少需要达到这个水平,但我现在做的事情非常相似;一些想法:
DynamicMethod
等) - 或将其作为硬核,Reflection.Emit
?unsafe
了吗? (在需要测量的地方使用节约)stloc
/ ldloc
,并删除了几乎所有的本地(减少了进程中的堆栈大小) )但老实说,你需要在这里介绍一下。专注于真正重要的事情,或者你知道你有问题要解决的问题。
答案 4 :(得分:1)
你提到数组比List更快。当您访问数组时,CLR实际上会为您执行基本边界检查。因此,通过使用 unsafe 关键字,然后使用指针算法访问数组,您将能够获得更高的性能。只有在您确实需要时才这样做 - 您可以衡量特定情况下的性能改进。
答案 5 :(得分:1)
当您询问低级优化(几乎每个人都这样做)时,您基本上猜测这些事情会很重要。也许在某种程度上他们会,但几乎每个人都低估了高级优化可以节省的东西,这是猜不到的。
这就像众所周知的冰山一样,你可以看到的只是那里的一小部分。
Here's an example.我毫不犹豫地说“使用剖析器”,因为我没有 相反,I do this根据我的经验,效果要好得多。
答案 6 :(得分:0)
让垃圾收集器(GC)完成其工作,不要干扰直接调用GC.Collect
。这将阻碍内置GC算法有效运行,反过来运行速度较慢,而您对GC.Collect
的调用也会增加不必要的开销。
对于特定于GDI +,请致电Invalidate
以使控件或表单的客户区或特定矩形无效,而不是调用调用Refresh
和invalidate
的{{1}}来重新绘制控制。