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

o2gm4chl  于 2023-05-23  发布在  .NET
关注(0)|答案(3)|浏览(162)

编译器在优化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或更早版本的项目?
  • 使用.NET 3.5 CF部署到设备(如Windows CE 6.0)的项目?
rqdpfwrv

rqdpfwrv1#

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

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

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

7gcisfzg

7gcisfzg2#

这里有一个C# Preprocessor Directives的列表,但没有与C++ #pragma optimize完全等效的。
但是,可以使用MethodImplAttribute并像这样传递NoOptimizationMethodImplOptions来实现这一点:

using System.Runtime.CompilerServices;

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

nbysray53#

在C#中,没有与#pragma指令等效的指令。你所能做的就是禁用方法作用域。MethodImpl位于System.Runtime.CompilerServices中。

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

相关问题