web-dev-qa-db-fra.com

Désactiver l'optimisation du compilateur pour une fonction ou un bloc de code spécifique (C #)

Le compilateur fait un excellent travail d'optimisation pour les versions RELEASE, mais il peut parfois être utile de s'assurer que l'optimisation est désactivée pour une fonction locale (mais pas pour l'ensemble du projet en décochant Project Options > Optimize code).

En C++, ceci est réalisé en utilisant ce qui suit (avec le #pragma normalement commenté):

#pragma optimize( "", off )
// Some code such as a function (but not the whole project)
#pragma optimize( "", on )

Y a-t-il un équivalent en C #?

METTRE À JOUR

Plusieurs excellentes réponses suggèrent de décorer la méthode avec MethodImplOptions.NoOptimization. Cela a été implémenté dans .NET 3.5, mais pas dans la version Compact Framework (CF). Une question connexe est de savoir si un équivalent pour:

* 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

Vous pouvez décorer une méthode spécifique (ou un getter/setter de propriété) avec [MethodImpl(MethodImplOptions.NoOptimization)] et [MethodImpl(MethodImplOptions.NoInlining)], cela empêchera le JITter d'optimiser et d'inliner la méthode:

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

Cependant, il n'existe aucun moyen d'appliquer cet attribut à un bloc de code. L'attribut NoOptimization a également été ajouté dans .NET 3.5, ce qui pourrait être important pour le code hérité ou Compact Framework.

35
Groo

Il existe une liste de directives de préprocesseur C # . Il n'y a pas d'équivalent exact, mais il est possible de le faire en utilisant MethodImplAttribute et en lui passant le NoOptimizationMethodImplOptions comme ceci:

using System.Runtime.CompilerServices;

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

En c # il n'y a pas d'équivalent à la directive #pragma. Tout ce que vous pouvez faire est de désactiver la portée de la méthode. MethodImpl est dans System.Runtime.CompilerServices.

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