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

本文关键字:优化 编译器 代码 函数 | 更新日期: 2023-09-27 17:58:59

编译器在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)版本中。一个相关的后续问题是是否有一个等价物:

  • 项目目标。NET 3.0或更早版本
  • 使用部署到设备(如Windows CE 6.0)的项目。净3.5立方英尺

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

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

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

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

这里有一个C#预处理器指令列表,但没有与C++#pragma optimize完全等效的指令。

但是,可以使用MethodImplAttribute并将NoOptimization MethodImplOptions传递给它,如下所示:

using System.Runtime.CompilerServices;
class MyClass
{
    [MethodImplAttribute(MethodImplOptions.NoOptimization)] 
    public void NonOptimizeMethod()
    {
        // Do some stuff
    }
}

在c#中,没有与#pragma指令等效的指令。您所能做的就是禁用方法作用域。MethodImpl在系统中。运行时。编译器服务。

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