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

C#编译器会在循环中优化此操作吗?,c#,compiler-optimization,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 + verticesInnerSide

以下代码中
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;
}
for(int i=0;i
或者在循环外写入一次以下内容:

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;
}
myCalculatedVar=verticesInnerSides.Length/2;
对于(int i=0;i
在第一种情况下,C#编译器会优化此操作吗

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

  • 根据《代码完成》和许多其他建议:如果不需要,就不要优化

  • 如果需要,只需基准测试即可。(关于基准测试时要注意的问题,有很多帖子、博客和答案,但我相信您一定能够找到它们:)


  • 作为额外的奖励,这里有您需要的所有链接:)

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

    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;
    }
    
    myCalculatedVar=verticesInnerSides.Length/2;
    对于(int i=0;i

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

    为什么希望编译器为您优化它,而不是在一开始就正确地编写它?打开ILDSM并自己检查
    您似乎正在使用并行阵列反模式。请考虑使用对象和OOP。@ ViNex.n,在CLR层应用的大多数优化,而不是C语言到IL编译(例如方法内联)。我不同意成熟的优化“是万恶之源”的传统智慧。大多数优化都是免费的(就像这样)。它们是显而易见的,并且可以提高可读性、可维护性和安全性。您只需要检查或更改一个变量,而不是代码中的多个位置。如果你现在不优化,你可能永远不会优化它。如果你以后再看代码,如果你能在不引起问题的情况下修改一些东西,那就更难理解了。@TimSchmelter我完全同意可读性。代码应该写为可读。如果完成后出现性能问题,请找出问题所在,然后优化该位。否则,您可能会浪费时间,使代码更难阅读,同时可能会更慢。