我正在编写一个需要以极低的处理器速度运行的应用程序。该应用程序在整个运行过程中以创造性的方式创建和销毁内存,并且运行良好。发生了哪些编译器优化,所以我可以尝试构建它?
一个技巧是 CLR 处理数组比列表快得多,因此如果您需要处理列表中的大量元素,最好调用 ToArray() 并处理它,而不是一次又一次调用 ElementAt() .
我正在编写一个需要以极低的处理器速度运行的应用程序。该应用程序在整个运行过程中以创造性的方式创建和销毁内存,并且运行良好。发生了哪些编译器优化,所以我可以尝试构建它?
一个技巧是 CLR 处理数组比列表快得多,因此如果您需要处理列表中的大量元素,最好调用 ToArray() 并处理它,而不是一次又一次调用 ElementAt() .
构建你的系统,运行它,然后附加一个分析器来看看什么是慢的。然后使用 Stack Overflow、Google 和常识来加速这些领域。
最重要的是不要浪费时间加速实际上无关紧要的事情,所以分析非常重要。
您可能指的是高速,而不是低速。
语言错误。对于全面优化,您需要一些较低级别的东西。不过,大多数时候不需要。
注意顺便说一句,您对数组和列表的指示是错误的... List 是,取决于您选择的链接列表,因此具有与数组不同的性能特征。但这不是 CLR / 运行时的事情。
除了 StringBuilder - 我的主要建议是:使用 profiler。大多数人都试图在速度方面变得聪明,但从不分析,所以以后花很多时间在无用的优化上——你会变得更快,但物有所值。首先找出应用程序实际花费时间的地方。
如果您的应用程序中有很多字符串操作,请使用StringBuilder而不是字符串。应用程序的性能将大大提高。
还将字符串连接(+ 运算符)替换为 StringBuilder。
特定于 Windows Forms .NET,关闭DataGridView.AutoSizeColumnsMode
和AutoSizeRowMode
.
通常很少需要降到这个级别,但我现在正在做一些非常相似的事情;一些想法:
DynamicMethod
等等)- 或者把它当作核心,Reflection.Emit
?unsafe
吗?(谨慎使用,在您确实需要这样做的地方)stloc
/ ldloc
,并删除了几乎所有的本地人(减少了过程中的堆栈大小)但老实说,你需要在这里进行简介。专注于真正重要的事情,或者你知道你有问题需要解决的地方。
您提到数组比 List 更快。当您访问数组时,CLR 实际上会为您进行基本的边界检查。因此,您将能够通过使用unsafe关键字获得更多性能,然后使用指针算法访问数组。仅在您确实需要时才这样做 - 您可以衡量特定场景的性能改进。
让垃圾收集器(GC)做它的工作,不要干扰GC.Collect
直接调用。这将阻碍内置 GC 算法有效运行,进而运行速度变慢,并且您的调用GC.Collect
也会增加不必要的开销。
对于 GDI+ 特定的,调用Invalidate
使控件或窗体的客户区或特定矩形无效,而不是调用Refresh
哪个调用invalidate
并update
重新绘制控件。