5

考虑以下代码片段,在执行效率方面,遍历一个 3 维单曲数组,假设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 编译器是否会检测和优化这样的循环,可能会重新排序嵌套,或者我是否应该始终警惕潜在的性能损失,尤其是在可能发生的情况方面如果我试图并行化循环?

4

1 回答 1

3

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

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

于 2013-07-17T19:33:12.343 回答