web-dev-qa-db-ja.com

特定の関数またはコードブロックのコンパイラ最適化を無効にする(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でメソッドを装飾することを提案しています。これは、コンパクトフレームワーク(CF)バージョンではなく、.NET 3.5で実装されました。関連する後続の質問は、以下と同等かどうかです。

* projects targeting .NET 3.0 or earlier?
* projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
24
AlainD

特定のメソッド(またはプロパティゲッター/セッター)を[MethodImpl(MethodImplOptions.NoOptimization)]および[MethodImpl(MethodImplOptions.NoInlining)]で装飾できます。これにより、JITterがメソッドを最適化およびインライン化できなくなります。

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

ただし、この属性をコードのブロックに適用する方法はありません。また、NoOptimization属性が.NET 3.5に追加されました。これは、レガシーコードまたはCompact Frameworkにとって重要な場合があります。

35
Groo

C#プリプロセッサディレクティブ のリストがあります。完全に対応するものはありませんが、 MethodImplAttribute を使用してこれを実行し、NoOptimizationMethodImplOptions を次のように渡すことができます。

using System.Runtime.CompilerServices;

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

C#では、#pragmaディレクティブに相当するものはありません。できることは、メソッドスコープを無効にすることだけです。 MethodImplはSystem.Runtime.CompilerServicesにあります。

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