我们常常被告知这样的事情,
如果您正在调用一个返回值不会改变的方法,请将其从循环中取出。
例如在编写代码时:
for(int i=0; i < Instance.ExpensiveNonChangingMethod(); i++)
{
// Stuff
}
我想知道你是否可以告诉编译器给定相同的输入(和对象实例)你会得到相同的输出,所以它会知道它可以将它作为优化过程的一部分移出循环。
有这样的事吗?也许像code-contracts或spec#这样的东西?或者他们可以做这种事吗?
可以想象编译器可以推断某个方法是pure function它自己的吗?
我可以在C#中使用哪些内容来使编译器能够执行更多的优化,否则会这样做? 是的,我知道过早优化。我主要是出于好奇而要求,但如果确实存在上述内容,那么一旦标记该方法,它就会“免费”。
答案 0 :(得分:0)
答案 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
}