【问题标题】:Disable compiler optimisation for a specific function or block of code (C#)禁用特定函数或代码块的编译器优化 (C#)
【发布时间】:2016-12-02 15:26:37
【问题描述】:

编译器在对 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 等设备?

【问题讨论】:

    标签: c# .net optimization compact-framework compiler-optimization


    【解决方案1】:

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

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

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

    【讨论】:

    • 从来不知道这个选项,谢谢!我注意到 MethodImplOptions.NoOptimization 枚举是在 .NET 3.5 中添加的。您知道 3.0 或更早版本是否有等效版本?
    • @AlainD:不,.NET 3.0 中没有这样的选项。他们在 3.5 中添加了NoOptimization,然后在 4.5 中添加了AggressiveInlining,用于在某些情况下强制内联。
    • @Groo:好的,太好了。非常有用的答案和 cmets。在最近的一个项目中尝试过这个并且它可以工作,但在必须使用 CF(紧凑框架)的旧项目中却没有。将不得不为这个旧项目寻找替代方案。
    • @MartinBrown:.NET 3.5 (msdn.microsoft.com/en-us/library/…) 和 .NET 3.0 (msdn.microsoft.com/en-us/library/…)。小设备符号表示紧凑框架中公开的内容,顺便说一句。大多数开发人员使用完整版本的 .NET(而不是 CF),因此 CF 的限制不相关。
    • @MartinBrown:嗯,这很奇怪。在一个单独的项目中,使用 .NET 2.0 的完整版本,NoOptimization 标志可用(并且项目编译),但内置帮助和 MSDN 在线均未提及该标志的可用性。 MSDN 中的错误?可能不可用仅限于CF?
    【解决方案2】:

    有一个C# Preprocessor Directives 的列表。没有确切的等价物,但是可以使用 MethodImplAttribute 执行此操作,并将其传递给 NoOptimization MethodImplOptions,如下所示:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多