考虑以下代码片段,在执行效率方面遍历三维单列数组,假设process1()
和process2()
执行的时间相同:
float arr[mMax,nMax,oMax];
for (m = 0; m < mMax; m++)
for (n = 0; n < nMax; n++)
for (o = 0; o < oMax; o++)
{ process1(arr[m,n,o]); }
for (o = 0; o < oMax; o++)
for (n = 0; n < nMax; n++)
for (m = 0; m < mMax; m++)
{ process2(arr[m,n,o]); }
现在,众所周知,C#将.NET框架中的数组组织为行主结构。没有任何优化,我会假设第一个循环的执行速度比第二个循环快得多。
问题是:CLR的JIT或cs.exe / vb.exe编译器是否检测并优化了这样的循环,可能重新排序嵌套,或者我应该始终保持警惕,以防止潜在的性能命中,特别是在如果我尝试并行化循环会发生什么?
答案 0 :(得分:3)
这是您在C或C ++编译器中可能期望的那种优化。它实际上是当前的,在Build 2013会话的this video中提到了这种精确的优化。虽然针对C / C ++程序员,但很多内容对C#程序员来说也很有趣。存储器子系统的约束同样相关。实际上并不确定优化是否进入了VS2013,iirc还存在一个问题,它也减慢了原生编译器的速度。
但不,抖动优化器的预算非常紧张。花费太多时间会导致显着的启动延迟和执行暂停,因此无法承受这种分析。 C#程序员必须自己做。