禁用特定函数或代码块的编译器优化 (C#)
Disable compiler optimisation for a specific function or block of code (C#)
编译器在针对 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 等设备?
你可以用[MethodImpl(MethodImplOptions.NoOptimization)]
和[MethodImpl(MethodImplOptions.NoInlining)]
装饰一个特定的方法(或属性getter/setter),这将防止JITter优化和内联方法:
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }
但是,没有办法将此属性应用于代码块。 .NET 3.5 中还添加了 NoOptimization
属性,这对于遗留代码或 Compact Framework 可能很重要。
在 c# 中没有等效于 #pragma 指令。您所能做的就是禁用方法范围。 MethodImpl 在 System.Runtime.CompilerServices 中。
[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()
有一个这样的 C# Preprocessor Directives. There is no exact equivalent, however it is possible to do this using the MethodImplAttribute and passing it the NoOptimization
MethodImplOptions 列表:
using System.Runtime.CompilerServices;
class MyClass
{
[MethodImplAttribute(MethodImplOptions.NoOptimization)]
public void NonOptimizeMethod()
{
// Do some stuff
}
}
编译器在针对 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 等设备?
你可以用[MethodImpl(MethodImplOptions.NoOptimization)]
和[MethodImpl(MethodImplOptions.NoInlining)]
装饰一个特定的方法(或属性getter/setter),这将防止JITter优化和内联方法:
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }
但是,没有办法将此属性应用于代码块。 .NET 3.5 中还添加了 NoOptimization
属性,这对于遗留代码或 Compact Framework 可能很重要。
在 c# 中没有等效于 #pragma 指令。您所能做的就是禁用方法范围。 MethodImpl 在 System.Runtime.CompilerServices 中。
[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()
有一个这样的 C# Preprocessor Directives. There is no exact equivalent, however it is possible to do this using the MethodImplAttribute and passing it the NoOptimization
MethodImplOptions 列表:
using System.Runtime.CompilerServices;
class MyClass
{
[MethodImplAttribute(MethodImplOptions.NoOptimization)]
public void NonOptimizeMethod()
{
// Do some stuff
}
}