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# 编译器会在第一种情况下优化这个操作吗?
为什么要像第一个代码示例那样开始?第二个(不看编译器)似乎更有效率。
根据 Code Complete 和许多其他建议:如果不需要,请不要优化。
如果需要,只需进行基准测试。 (关于基准测试时要注意什么的话题、博客和答案很多,但我相信您一定能找到它们:)
作为额外奖励,这里 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;
}
但是你可以浪费你的时间写一些基准测试来测试这篇文章。我确信如果存在瓶颈,它将出现在代码中的另一个地方。
以下代码之间的最佳方法是什么,其中 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# 编译器会在第一种情况下优化这个操作吗?
为什么要像第一个代码示例那样开始?第二个(不看编译器)似乎更有效率。
根据 Code Complete 和许多其他建议:如果不需要,请不要优化。
如果需要,只需进行基准测试。 (关于基准测试时要注意什么的话题、博客和答案很多,但我相信您一定能找到它们:)
作为额外奖励,这里 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;
}
但是你可以浪费你的时间写一些基准测试来测试这篇文章。我确信如果存在瓶颈,它将出现在代码中的另一个地方。