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

本文关键字:帮助 编译器 优化 工具 关键字 | 更新日期: 2023-09-27 18:02:48

我们经常听到这样的话:

如果你调用一个返回值不变的方法,把它从循环中删除。

例如,当编写如下代码时:
for(int i=0; i < Instance.ExpensiveNonChangingMethod(); i++)
{
    // Stuff
}

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

这样的东西存在吗?也许是代码契约或spec#之类的东西?或者他们已经在做这类事情了?

是否可以想象编译器可以推断出一个方法本身是一个纯函数?

有什么我可以在c#中使用,将使编译器执行更多的优化,否则会吗?是的,我知道过早优化。我问这个问题主要是出于好奇,但如果上面的东西确实存在,那么一旦标记了方法,它将是"免费的"。

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

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

它检测到的18个性能相关问题的列表在这里。

但是,它不检测您提到的特定示例。

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

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
}