Отключить оптимизацию компилятора для определенной функции или блока кода (С#)
Компилятор отлично справляется с оптимизацией для сборки RELEASE, но иногда может быть полезно обеспечить, чтобы оптимизация была отключена для локальной функции (но не весь проект, отключив Project Options > Optimize code
).
В С++ это достигается с помощью следующего (с нормально откомментированным #pragma
):
#pragma optimize( "", off )
// Some code such as a function (but not the whole project)
#pragma optimize( "", on )
Есть ли эквивалент в С#?
UPDATE
Несколько отличных ответов предлагают украсить метод с помощью MethodImplOptions.NoOptimization
. Это было реализовано в .NET 3.5, но не в версии Compact Framework (CF). Связанный с этим следующий вопрос заключается в том, является ли эквивалент для:
* projects targeting .NET 3.0 or earlier?
* projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
Ответы
Ответ 1
Вы можете украсить определенный метод (или свойство getter/setter) с помощью [MethodImpl(MethodImplOptions.NoOptimization)]
и [MethodImpl(MethodImplOptions.NoInlining)]
, это не позволит JITter оптимизировать и вставить метод:
[MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)]
private void MethodWhichShouldNotBeOptimized()
{ }
Однако не существует способа применить этот атрибут к блоку кода. Также в .NET 3.5 был добавлен атрибут NoOptimization
, который может иметь важное значение для устаревшего кода или Compact Framework.
Ответ 2
Существует список Директивы препроцессора С#. Точного эквивалента нет, однако это можно сделать с помощью MethodImplAttribute и передать его NoOptimization
MethodImplOptions следующим образом:
using System.Runtime.CompilerServices;
class MyClass
{
[MethodImplAttribute(MethodImplOptions.NoOptimization)]
public void NonOptimizeMethod()
{
// Do some stuff
}
}
Ответ 3
В С# нет эквивалента директиве #pragma. Все, что вы можете сделать, это отключить область метода. MethodImpl находится в System.Runtime.CompilerServices.
[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()