Noop方法避免c#编译器优化掉临时变量

时间:2015-12-07 15:42:21

标签: c# optimization

在派生计算上下文中,我需要确保x和x + h之间有一个完全可表示的数字,所以我这样做了:

var temp = x + deltaX;
DoNothing(temp);
deltaX = temp - x;

DoNothing()方法存在,以防止temp被优化掉。

这是处理这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:4)

您担心的编译器优化对.NET无效。它已知用C ++完成,快速数学和#34;编译器设置。 .NET保证IEEE浮点行为,但允许过多的精度(这里不是问题)。优化将是一般的价值变化,因此它是被禁止的。

如果你想清除编译器对值的了解,我总是使用:

[MethodImplOptions(NoInlining)]
T F<T>(T x) { return x; }

这不能保证有效,但它适用于目前存在的所有JIT。 .NET JIT在优化方面非常薄弱,我怀疑它们会添加那种会使这个技巧停止运行的数据流分析。