例如,我知道它被定义为海湾合作委员会,并在Linux内核中使用的:
#定义可能(X)__builtin_expect((X),1)
的#define不大可能(x)的__builtin_expect((X),0)
如果这样的事是可能在C#中,是手动重新排序的最佳替代if语句,将最有可能的情况下,第一个?是否有任何其他方式基于这种外部知识的?
优化在一个相关的说明,CLR知道如何识别后卫条款,并假定另一个支路将采取,使这种优化不恰当的防范clases使用,是否正确?
(请注意,我意识到这可能是一个微型的优化,我只是为学术目的,有兴趣的。)
解决方案简短的回答:没有
再回应:你没的真正的需要在大多数情况下。您的可以的改变逻辑的语句给予提示。这是容易做到与性能的工具,像一个建立在更高(更贵)版本的Visual Studio,因为你可以捕捉到错误predicted分行柜台。我意识到这是学术的目的,但它是很好的知道,JITer是的非常的善于优化你的code为您服务。为
为例(通过C#采取pretty的从 CLR多少逐字)这code:
公共静态无效的主要(){
的Int32 [] =一个新的Int32 [5];
对于(的Int32指数= 0;指数<则为a.length;指数++){
//做一些事情了[索引]
}
}
看起来可能是低效的,因为则为a.length
是一个属性,因为我们知道在C#中,属性实际上是一组的两个方法( get_Length
和 set_Length
在这种情况下)。然而,JIT知道,这是一个财产,无论是存储在你的局部变量的长度,或内联的方式,以prevent的开销。
...一些开发商低估了能力 JIT编译器和试图在试图帮助JIT写巧code 编译器。但是,你想出任何聪明的企图几乎肯定会产生影响 性能产生不利,让您的code难读,减少其可维护性。
除其他事项外,它实际上更进一步并执行边界检查一次的外循环的而不是环,这会降低性能的内部。
我意识到它几乎没有直接与你的问题的事,但我想,我想说明一点的是,微优化,这样真的不帮你多少在C#中,这是因为JIT一般做它更好,因为它恰恰设计用于此。 (有趣的事实,在x86 JIT编译器执行更积极的优化比64对应)
本文解释一些添加在.NET 3.5 SP1,跻身优化他们正在改进矫直分支机构,以提高prediction和缓存位置。
所有这一切都这样说,如果你想读一个伟大的书,进入什么样的编译器生成和CLR的表现,我推荐这本书,我从上面,CLR通过C#引用。
编辑:我要指出,如果这是目前可能在.net中,你会发现无论是在的
相关推荐
最新文章