禁用特定函数或代码块的编译器优化(C#)
编译器在优化RELEASE构建方面做得很好,但有时候确保为本地函数关闭优化(但不是通过取消Project Options > Optimize code
来关闭整个项目)。
在C ++中,这可以通过以下方式实现( #pragma
通常已注释掉):
#pragma optimize( "", off ) // Some code such as a function (but not the whole project) #pragma optimize( "", on )
C#中有等价的吗?
UPDATE
几个优秀的答案建议使用MethodImplOptions.NoOptimization
装饰方法。 这是在.NET 3.5中实现的,但不是在Compact Framework(CF)版本中。 一个相关的后续问题是,是否相当于:
* projects targeting .NET 3.0 or earlier? * projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
您可以使用[MethodImpl(MethodImplOptions.NoOptimization)]
和[MethodImpl(MethodImplOptions.NoInlining)]
修饰特定方法(或属性getter / setter),这将阻止JITter优化和内联方法:
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] private void MethodWhichShouldNotBeOptimized() { }
但是,没有办法将此属性应用于代码块。 此外,在.NET 3.5中添加了NoOptimization
属性,这对于遗留代码或Compact Framework可能很重要。
有一个C#预处理器指令列表。 没有确切的等价物,但是可以使用MethodImplAttribute执行此操作并向其传递NoOptimization
MethodImplOptions,如下所示:
using System.Runtime.CompilerServices; class MyClass { [MethodImplAttribute(MethodImplOptions.NoOptimization)] public void NonOptimizeMethod() { // Do some stuff } }
在c#中,没有与#pragma指令等价的东西。 您所能做的就是方法范围禁用。 MethodImpl位于System.Runtime.CompilerServices中。
[MethodImpl(MethodImplOptions.NoOptimization)] void TargetMethod ()