C#编译器会在循环内优化此操作吗?

时间:2015-02-06 08:20:24

标签: c# compiler-optimization

以下代码之间的最佳方法是什么?verticesInnerSides.Length / 2每次写入for (int i = 0; i < verticesRoof.Length; i++) { verticesInnerSides[i * NB_VERTICES + verticesInnerSides.Length / 2] = startInside; verticesInnerSides[i * NB_VERTICES + verticesInnerSides.Length / 2 + 1] = startInside + Vector3.up * HEIGHT_ROOF; verticesInnerSides[i * NB_VERTICES + verticesInnerSides.Length / 2 + 2] = endInside; verticesInnerSides[i * NB_VERTICES + verticesInnerSides.Length / 2 + 3] = endInside + Vector3.up * HEIGHT_ROOF; } 的完整形式:

myCalculatedVar = verticesInnerSides.Length / 2;
for (int i = 0; i < verticesRoof.Length; i++) {
    verticesInnerSides[i * NB_VERTICES + myCalculatedVar] = startInside;
    verticesInnerSides[i * NB_VERTICES + myCalculatedVar + 1] = startInside + Vector3.up * HEIGHT_ROOF;
    verticesInnerSides[i * NB_VERTICES + myCalculatedVar + 2] = endInside;
    verticesInnerSides[i * NB_VERTICES + myCalculatedVar + 3] = endInside + Vector3.up * HEIGHT_ROOF;
}

或者以下它在循环外写一次:

{{1}}

C#编译器会在第一种情况下优化此操作吗?

2 个答案:

答案 0 :(得分:1)

  1. 为什么要像第一个代码示例一样开始?第二个(不看编译器)似乎更有效。

  2. 根据Code Complete和许多其他建议:如果您不需要,请不要进行优化。

  3. 如果您需要,只需基准测试。 (关于基准测试时需要注意的内容有很多主题,博客和答案,但我相信你能找到它们:)

  4. 作为额外奖励,这里是another answer,其中包含您需要的所有链接:)

答案 1 :(得分:1)

在我看来,达到可读性和性能的最佳方法是:

myCalculatedVar = verticesInnerSides.Length / 2;
for (int i = 0; i < verticesRoof.Length; i++) {
    int ind = i * NB_VERTICES + myCalculatedVar;
    verticesInnerSides[ind] = startInside;
    verticesInnerSides[ind + 1] = startInside + Vector3.up * HEIGHT_ROOF;
    verticesInnerSides[ind + 2] = endInside;
    verticesInnerSides[ind + 3] = endInside + Vector3.up * HEIGHT_ROOF;
}

但是你可以浪费你的时间并为测试这篇文章写一些基准测试。我确信如果存在瓶颈,它将存在于代码中的另一个位置。