有哪些关键字/工具可以帮助编译器优化
本文关键字:帮助 编译器 优化 工具 关键字 | 更新日期: 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
}