Отключить оптимизацию компилятора для конкретной функции или блока кода (C#)
компилятор выполняет большую работу по оптимизации сборок выпуска, но иногда может быть полезно убедиться, что оптимизация отключена для локальной функции (но не для всего проекта, сняв 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). Связанный последующий вопрос заключается в том, является ли эквивалент для:
* projects targeting .NET 3.0 or earlier?
* projects deployed to a device such as Windows CE 6.0 using the .NET 3.5 CF?
3 ответов
вы можете украсить определенный метод (или свойство getter/setter) с [MethodImpl(MethodImplOptions.NoOptimization)]
и [MethodImpl(MethodImplOptions.NoInlining)]
, это предотвратит дрожание от оптимизации и вставки метода:
[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 находится в системе.Во время выполнения.CompilerServices.
[MethodImpl(MethodImplOptions.NoOptimization)]
void TargetMethod ()