【问题标题】:.NET Compiler -- Are there nested loop optimizations built-in?.NET 编译器——是否有内置的嵌套循环优化?
【发布时间】:2013-07-17 19:02:56
【问题描述】:

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

【问题讨论】:

  • 一般情况下你不应该寄希望于编译器优化

标签: c# .net task-parallel-library compiler-optimization


【解决方案1】:

这是您可能期望在 C 或 C++ 编译器中进行的优化。它实际上是最新的,在 Build 2013 会话的this video 中提到了这种精确的优化。虽然针对 C/C++ 程序员,但其中涵盖的很多内容对 C# 程序员也很有趣。内存子系统的约束同样重要。实际上不确定优化是否进入了 VS2013,iirc 也存在问题,它也会降低原生编译器的速度。

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

【讨论】:

  • 视频很精彩;感谢您链接到它。不过,我的印象是,C# 编译器开发组与 C/C++ 开发组的集成不够紧密,无法向我们保证这些优化正在进行中。你同意吗?
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多