有哪些关键字/工具可以帮助编译器进行优化

时间:2011-07-19 07:11:16

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

我们常常被告知这样的事情,

  

如果您正在调用一个返回值不会改变的方法,请将其从循环中取出。

例如在编写代码时:

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

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

有这样的事吗?也许像这样的东西?或者他们可以做这种事吗?

可以想象编译器可以推断某个方法是pure function它自己的吗?

我可以在C#中使用哪些内容来使编译器能够执行更多的优化,否则会这样做? 是的,我知道过早优化。我主要是出于好奇而要求,但如果确实存在上述内容,那么一旦标记该方法,它就会“免费”。

2 个答案:

答案 0 :(得分:0)

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

它检测到的18个与效果相关的问题列表为here

但是,它没有检测到您提到的具体示例。

答案 1 :(得分:0)

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

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
}