3

我正在编写一个需要以极低的处理器速度运行的应用程序。该应用程序在整个运行过程中以创造性的方式创建和销毁内存,并且运行良好。发生了哪些编译器优化,所以我可以尝试构建它?

一个技巧是 CLR 处理数组比列表快得多,因此如果您需要处理列表中的大量元素,最好调用 ToArray() 并处理它,而不是一次又一次调用 ElementAt() .

4

7 回答 7

8

构建你的系统,运行它,然后附加一个分析器来看看什么是慢的。然后使用 Stack Overflow、Google 和常识来加速这些领域。

最重要的是不要浪费时间加速实际上无关紧要的事情,所以分析非常重要。

于 2010-03-09T11:33:40.710 回答
6

您可能指的是高速,而不是低速。

语言错误。对于全面优化,您需要一些较低级别的东西。不过,大多数时候不需要。

注意顺便说一句,您对数组和列表的指示是错误的... List 是,取决于您选择的链接列表,因此具有与数组不同的性能特征。但这不是 CLR / 运行时的事情。

除了 StringBuilder - 我的主要建议是:使用 profiler。大多数人都试图在速度方面变得聪明,但从不分析,所以以后花很多时间在无用的优化上——你会变得更快,但物有所值。首先找出应用程序实际花费时间的地方。

于 2010-03-09T11:25:40.837 回答
2

如果您的应用程序中有很多字符串操作,请使用StringBuilder而不是字符串。应用程序的性能将大大提高。

还将字符串连接(+ 运算符)替换为 StringBuilder。

特定于 Windows Forms .NET,关闭DataGridView.AutoSizeColumnsModeAutoSizeRowMode.

于 2010-03-09T11:23:25.323 回答
2

通常很少需要降到这个级别,但我现在正在做一些非常相似的事情;一些想法:

  • 你有经常使用的缓冲区吗?您是否考虑过汇集它们?也就是说,不是创建一个的,而是要求一个池获取(或创建)一个?
  • 你有没有删除任何反射?(替换为类型化的代表,DynamicMethod等等)- 或者把它当作核心,Reflection.Emit
  • 你考虑过unsafe吗?(谨慎使用,在您确实需要这样做的地方)
  • (再次,相当低的水平)你在 IL 中寻找过什么愚蠢的东西吗?我最近发现很多循环(在一些特定的代码中)被用来在堆栈上洗牌以适当地传递参数。通过更改代码(并且,诚然做了一些自定义 IL),我消除了所有不必要的(洗牌)stloc/ ldloc,并删除了几乎所有的本地人(减少了过程中的堆栈大小)

但老实说,你需要在这里进行简介。专注于真正重要的事情,或者你知道你有问题需要解决的地方。

于 2010-03-09T12:13:02.030 回答
1

您提到数组比 List 更快。当您访问数组时,CLR 实际上会为您进行基本的边界检查。因此,您将能够通过使用unsafe关键字获得更多性能,然后使用指针算法访问数组。仅在您确实需要时才这样做 - 您可以衡量特定场景的性能改进。

于 2010-03-09T11:51:46.627 回答
1

当您询问低级优化(几乎每个人都会这样做)时,您基本上是在猜测这些事情很重要。也许在某种程度上他们会,但几乎每个人都低估了高级优化可以节省的东西,而这是靠猜测无法做到的。

这就像众所周知的冰山,你能看到的只是那里的一小部分。

这是一个例子。我犹豫说“使用分析器”,因为我没有。
相反,我这样做,根据我的经验,效果要好得多。

于 2010-03-09T14:35:47.970 回答
0

让垃圾收集器(GC)做它的工作,不要干扰GC.Collect直接调用。这将阻碍内置 GC 算法有效运行,进而运行速度变慢,并且您的调用GC.Collect也会增加不必要的开销。

对于 GDI+ 特定的,调用Invalidate使控件或窗体的客户区或特定矩形无效,而不是调用Refresh哪个调用invalidateupdate重新绘制控件。

于 2010-03-09T11:28:38.530 回答