コンパイラーは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?
特定のメソッド(またはプロパティゲッター/セッター)を[MethodImpl(MethodImplOptions.NoOptimization)]
および[MethodImpl(MethodImplOptions.NoInlining)]
で装飾できます。これにより、JITterがメソッドを最適化およびインライン化できなくなります。
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }
ただし、この属性をコードのブロックに適用する方法はありません。また、NoOptimization
属性が.NET 3.5に追加されました。これは、レガシーコードまたはCompact Frameworkにとって重要な場合があります。
C#プリプロセッサディレクティブ のリストがあります。完全に対応するものはありませんが、 MethodImplAttribute を使用してこれを実行し、NoOptimization
MethodImplOptions を次のように渡すことができます。
using System.Runtime.CompilerServices;
class MyClass
{
[MethodImplAttribute(MethodImplOptions.NoOptimization)]
public void NonOptimizeMethod()
{
// Do some stuff
}
}
C#では、#pragmaディレクティブに相当するものはありません。できることは、メソッドスコープを無効にすることだけです。 MethodImplはSystem.Runtime.CompilerServicesにあります。
[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()