【问题标题】:Will C# compiler optimize this operation inside a loop?C# 编译器会在循环内优化此操作吗?
【发布时间】:2015-02-06 08:20:23
【问题描述】:

下面的代码之间的最佳方法是什么,每次都以完整的形式编写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#编译器会在第一种情况下优化这个操作吗?

【问题讨论】:

  • 为什么希望编译器为您优化它而不是一开始就正确编写它?
  • 看来您正在使用并行阵列反模式。请考虑使用对象和 OOP。
  • @Vignesh.N,大多数优化都应用在 CLR 层,而不是 C# 到 IL 编译(例如方法内联)。

标签: c# compiler-optimization


【解决方案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;
}

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

【讨论】:

    【解决方案2】:
    1. 你为什么要像第一个代码示例一样开始呢?第二个(不看编译器)似乎更有效。

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

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

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

    【讨论】:

    • 我不同意过早的优化“是万恶之源”的传统观点。大多数优化都是免费的(像这样)。它们很明显,也可以增加可读性、可维护性和安全性。您只需检查或更改一个变量,而不是代码中的多个位置。如果你现在不优化,你可能永远不会优化它。如果您稍后查看代码,是否可以更改某些内容而不会导致问题,这将更加难以理解。
    • @TimSchmelter 我绝对同意可读性。代码应该是为了阅读而编写的。如果完成后,您遇到了性能问题,请找出问题所在,然后优化该位。否则,您可能会浪费时间并使代码更难阅读,同时可能更慢。
    猜你喜欢
    • 2011-03-04
    • 2012-12-11
    • 1970-01-01
    • 2017-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    相关资源
    最近更新 更多