禁用特定函数或代码块(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立方英尺
您可以用[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 ()