.NET编译器 - 内置嵌套循环优化吗?

Rob*_*ins 5 .net c# compiler-optimization task-parallel-library

考虑以下代码片段,在执行效率方面遍历三维单列数组,假设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]); }
Run Code Online (Sandbox Code Playgroud)

现在,众所周知,C#将.NET框架中的数组组织为行主结构.没有任何优化,我会假设第一个循环的执行速度比第二个循环快得多.

问题是:CLR的JIT或cs.exe/vb.exe编译器是否检测并优化这样的循环,可能重新排序嵌套,或者我应该始终保持警惕潜在的性能命中,特别是在可能发生的情况方面如果我试图并行化循环?

Han*_*ant 3

这是您在 C 或 C++ 编译器中可能期望的优化类型。它实际上是相当当前的,这个确切的优化在Build 2013 会议的视频中提到过。虽然针对的是 C/C++ 程序员,但其中涵盖的很多内容对于 C# 程序员来说也很有趣。内存子系统的约束同样重要。实际上不确定优化是否会进入 VS2013,iirc 也存在一个问题,它也会使本机编译器减慢太多。

但不,抖动优化器的预算非常紧张。花费太多时间会导致明显的启动延迟和执行暂停,因此它无法承受此类分析。C# 程序员必须自己做这件事。