2011-01-13 4 views
4

Un programme .NET compilé pour CLR 2.0 s'exécutera-t-il plus rapidement s'il est exécuté sous CLR 4.0?Performance CLR 2.0 vs 4.0?

app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <startup> 
    <supportedRuntime version="v4.0.30319" sku=".NETFramework,Version=v4.0,Profile=Client" /> 
    <supportedRuntime version="v2.0.50727"/> 
    </startup> 
</configuration> 
+0

Peut-être si elle atteint l'un des points où l'exécution 4.0 est meilleure que l'exécution 2.0. Mais je ne sais pas s'il y a beaucoup de spots. – CodesInChaos

+0

Je ne doute pas que, pour certaines situations, c'est plus rapide. Ce n'est probablement pas le goulot d'étranglement dans votre application, si c'est la direction que vous venez. –

+7

Une seule façon de le savoir. Essayez-le et voyez! –

Répondre

7

En règle générale, pas - il sera identique.

Par défaut, le runtime CLR 4 chargera le runtime CLR 2 pour exécuter votre base de code CLR 2. Pour forcer l'exécution sous CLR 4, vous devez définir useLegacyV2RuntimeActivationPolicy dans votre application. Config.

Si vous ajoutez ce drapeau, il s'exécutera dans v4 du CLR. En général, les performances sont susceptibles d'être très similaires, mais elles peuvent différer légèrement avec le nouveau runtime, en raison des modifications apportées au JIT et à l'exécution principale. Il n'y a aucune garantie que CLR 4 sera plus rapide - il peut être plus lent parfois, bien qu'en général, je m'attendrais à ce que la performance soit très proche sous les deux runtimes.

Si vous rencontrez des problèmes de performances, profilez votre application. La modification du moteur d'exécution ne corrige pas les problèmes de performances. Le profil de votre application tout en s'exécutant sous les deux sera le seul moyen de savoir si cela fait une différence pour vous.

+0

Puis-je poser une question sur votre réponse, ce qui me déroute? _ "Le runtime CLR 4 chargera le runtime CLR 2 pour exécuter votre base de code CLR 2." _ signifie que si une application est construite sous le CLR 2.0 et son app.config a '< supportedRuntime version = "v4.0" /> ', l'application sera-t-elle exécutée sous le CLR 2.0 malgré le app.config, ayant CLR 4.0? –

+0

@Reed - Par [ma publication] (http://stackoverflow.com/questions/6921976/#6963368) et la documentation MSDN, 'useLegacyV2RuntimeActivationPolicy' ne s'applique qu'aux assemblages en mode mixte. Les seuls paramètres qui devraient importer pour ordinaire.Les applications réseau avec du code purement géré sont les balises 'supportedRuntimes', afin de forcer une application plus ancienne à utiliser un CLR plus récent. – nekno

0

De manière générale, pas sensiblement. Les runtimes sont toutes rétrocompatibles, et les librairies AFAIK trouvées dans les anciennes versions n'étaient modifiées que si la spécification de langage changeait (par exemple en ajoutant un support de covariance/contravariance) ou bien elle était identifiée comme une véritable mémoire/CPU.

0

Habituellement: No.

Il y a quelques cas d'angle ont été une amélioration des performances, à savoir si l'application inonde le ThreadPool avec de petits morceaux de travail puis les optimisations ThreadPool de travail voler seront une grande victoire. Cela pourrait également modifier de manière significative l'ordre dans lequel le travail est effectué, de sorte que certaines applications qui dépendent accidentellement de la commande pourraient tomber en panne.

GC (compactage d'objets med-large) et Interop (modifications de verrouillage d'objet).

Résumé

Si les performances d'un .NET 3.5 (CLR 2.x) application est pire que prévu puis essayer l'application sur 4,5 .NET (CLR 4.x).