【问题标题】:What keywords/tools are there to help the compiler optimise有哪些关键字/工具可以帮助编译器优化
【发布时间】:2011-07-19 07:11:15
【问题描述】:

我们经常被告知,

如果您正在调用返回值不变的方法,请将其移出循环。

例如在编写如下代码时:

for(int i=0; i < Instance.ExpensiveNonChangingMethod(); i++)
{
    // Stuff
}

我想知道你是否可以告诉编译器给定相同的输入(和对象实例)你会得到相同的输出,所以它会知道它可以将它移出循环作为优化过程的一部分。

这样的事情存在吗?也许像 或 之类的?或者他们已经可以做这种事情了?

是否可以想象编译器可以推断出方法是pure function its-self?

我可以在 C# 中使用什么东西来使编译器能够执行更多优化吗? 是的,我知道过早的优化。我主要是出于好奇而询问,但如果确实存在上述类似的东西,一旦标记了方法,它将是“免费”的。

【问题讨论】:

  • 顺便说一句;目前的答案是“你;你是做这件事的工具”——不是贬义的意思,他很快补充道。
  • 您可能会根据手动 [Pure] 注释制作一个重写器,将这样的事情从循环中解救出来。

标签: code-contracts spec# c# .net code-contracts compiler-optimization spec#


【解决方案1】:

Microsoft FxCop 检测到一些效率问题,它是Platform SDK 的一部分。

它检测到的 18 个与性能相关的问题列表是 here。

但是,它不会检测到您提到的具体示例。

【讨论】:

    【解决方案2】:

    这可能不是您想要的,但您可能能够重写循环,以便仅显式调用一次昂贵的方法(在循环开始时):

    for (int i = Instance.ExpensiveNonChangingMethod();  i-- >= 0; )
    {
        // Stuff
    }
    

    这也可以写成:

    int i = Instance.ExpensiveNonChangingMethod();
    while (i-- >= 0)
    {
        // Stuff
    }
    

    另一个明显的方法是只使用一个临时变量(这意味着自己进行优化):

    int n = Instance.ExpensiveNonChangingMethod();
    for (int i = 0;  i < n;  i++)
    {
        // Stuff
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2023-04-10
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多