为什么要注释这个for循环的前两行,并在42%的加速时取消注释第三个结果?
int count = 0;
for (uint i = 0; i < 1000000000; ++i) {
var isMultipleOf16 = i % 16 == 0;
count += isMultipleOf16 ? 1 : 0;
//count += i % 16 == 0 ? 1 : 0;
}
Run Code Online (Sandbox Code Playgroud)
在时序背后是非常不同的汇编代码:循环中的13对7指令.该平台是运行.NET 4.0 x64的Windows 7.启用了代码优化,测试应用程序在VS2010之外运行.[ 更新: Repro项目,对验证项目设置很有用.]
消除中间布尔值是一个基本的优化,是我1980年代龙书中最简单的一个.在生成CIL或JITing x64机器代码时,如何不应用优化?
有没有"真正的编译器,我希望你优化这段代码,请"切换?虽然我同情过早优化类似于对金钱的热爱的情绪,但我可以看到试图描述一个复杂算法的挫败感,这个算法在整个惯例中分散.你可以通过热点工作,但没有暗示更广泛的温暖区域可以通过手动调整我们通常认为理所当然的编译器来大大改善.我当然希望我在这里遗漏一些东西.
更新: x86也会出现速度差异,但取决于方法即时编译的顺序.请参阅为什么JIT订单会影响性能?
汇编代码(根据要求):
var isMultipleOf16 = i % 16 == 0;
00000037 mov eax,edx
00000039 and eax,0Fh
0000003c xor ecx,ecx …Run Code Online (Sandbox Code Playgroud) 我试图了解如何配置我想要使用的JIT类型.
说,我知道有3种类型的JIT(Pre,Econo和Normal).但是有以下奇怪的问题.
.NET在部署服务器中运行的默认JIT是什么?
如果默认设置正常,我们是否可以灵活地更改设置以使用pre或econo.如果是这样我可以改变这个?
不确定,如果此设置在machine.config或其他什么?