.NET编译器优化

时间:2010-03-09 11:19:03

标签: c# .net optimization clr il

我正在编写一个应用程序,我需要以极低的处理器速度运行。应用程序在整个运行过程中以创造性的方式创建和销毁内存,并且工作得很好。什么编译器优化发生,所以我可以尝试构建到那个?

现有的一个技巧是CLR处理数组比列表快得多,所以如果你需要处理List中的大量元素,你可能最好调用ToArray()并处理它而不是调用ElementAt()一次又一次。

7 个答案:

答案 0 :(得分:8)

构建系统,运行它,然后附加分析器以查看速度有多慢。然后使用Stack Overflow,Google和常识来加速这些领域。

最重要的是不要浪费时间加快实际无关紧要的事情,因此分析非常重要。

答案 1 :(得分:6)

你可能意味着高速,而不是低速。

语言错误。对于总体优化,您需要更低级别的东西。但是,大部分都不需要。

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

除了StringBuilder之外 - 我的主要建议是:使用分析器。大多数人都试图通过速度变得聪明,但从不描述,因此在以后花费大量时间进行无用的优化 - 你得到的速度更快,但是更糟糕。首先找出应用程序实际花费时间的位置。

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

通常很少需要达到这个水平,但我现在做的事情非常相似;一些想法:

  • 您是否有正常使用的缓冲区?你考虑过汇集吗?即,不是创建一个新的,而是要求池获取(或创建)一个?
  • 你删除了任何反射吗? (替换为已键入的代理,DynamicMethod等) - 或将其作为硬核,Reflection.Emit
  • 您考虑过unsafe了吗? (在需要测量的地方使用节约
  • (再次,相当低级别)你有没有在IL中找到任何愚蠢的东西?我最近发现一个很多的循环(在某些特定的代码中)被用来在堆栈上乱扔东西来传递适当的参数。通过更改代码(并且,无可否认地做一些自定义IL),我已经消除了所有不必要的(混乱)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以使控件或表单的客户区或特定矩形无效,而不是调用调用Refreshinvalidate的{​​{1}}来重新绘制控制。