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

Ala*_*inD 22 .net c# optimization compact-framework compiler-optimization

编译器在优化RELEASE构建方面做得很好,但有时候确保为本地函数关闭优化(但不是通过unticking来关闭整个项目Project Options > Optimize code)会很有用.

在C++中,这是使用以下内容实现的(#pragma通常注释掉):

#pragma optimize( "", off )
// Some code such as a function (but not the whole project)
#pragma optimize( "", on )
Run Code Online (Sandbox Code Playgroud)

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?
Run Code Online (Sandbox Code Playgroud)

Gro*_*roo 32

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

[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*own 9

有一个C#预处理器指令列表.没有完全等效,但它是可以做到这一点使用MethodImplAttribute并向其传递NoOptimization MethodImplOptions是这样的:

using System.Runtime.CompilerServices;

class MyClass
{
    [MethodImplAttribute(MethodImplOptions.NoOptimization)] 
    public void NonOptimizeMethod()
    {
        // Do some stuff
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

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

[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()
Run Code Online (Sandbox Code Playgroud)