禁用特定函数或代码块的编译器优化(C#)

时间:2016-07-28 09:54:01

标签: c# .net optimization compact-framework compiler-optimization

编译器在优化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#中是否有等价物?

更新

几个优秀的答案建议用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?

3 个答案:

答案 0 :(得分:29)

您可以使用[MethodImpl(MethodImplOptions.NoOptimization)][MethodImpl(MethodImplOptions.NoInlining)]修饰特定方法(或属性getter / setter),这将阻止JITter优化和内联方法:

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }

但是,没有办法将此属性应用于代码块。此外,在.NET 3.5中添加了NoOptimization属性,这对于遗留代码或Compact Framework可能很重要。

答案 1 :(得分:6)

有一个C# Preprocessor Directives列表。没有确切的等价物,但是可以使用MethodImplAttribute执行此操作并将NoOptimization MethodImplOptions传递给它:

using System.Runtime.CompilerServices;

class MyClass
{
    [MethodImplAttribute(MethodImplOptions.NoOptimization)] 
    public void NonOptimizeMethod()
    {
        // Do some stuff
    }
}

答案 2 :(得分:4)

在c#中没有与#pragma指令等价的东西。您所能做的就是方法范围禁用。 MethodImpl位于System.Runtime.CompilerServices中。

[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()