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

Will C# compiler optimize this operation inside a loop?

以下代码之间的最佳方法是什么,其中 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;
}

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

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

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

  3. 如果需要,只需进行基准测试。 (关于基准测试时要注意什么的话题、博客和答案很多,但我相信您一定能找到它们:)

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

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

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;
}

但是你可以浪费你的时间写一些基准测试来测试这篇文章。我确信如果存在瓶颈,它将出现在代码中的另一个地方。