4 votes

Tous les langages utilisés dans .net sont-ils aussi performants les uns que les autres ?

Je sais que la réponse à cette question est "oui", mais est-ce techniquement vrai ?

Le Common Language Runtime (CLR) est conçu comme un langage intermédiaire basé sur la programmation impérative (IP), mais cela a des implications évidentes lorsqu'il s'agit de programmation déclarative (DP).

Ainsi, quelle est l'efficacité d'un langage basé sur un paradigme différent du style impératif lorsqu'il est mis en œuvre dans le CLR ?

J'ai également l'impression que le passage au DP entraînerait un niveau d'abstraction supplémentaire qui pourrait ne pas être un modèle du tout performant, est-ce un commentaire juste ?

J'ai effectué quelques tests simples en utilisant F# et tout semble parfait, mais est-ce que je rate quelque chose si les programmes deviennent plus complexes ?

8voto

Lasse V. Karlsen Points 148037

Il n'y a aucune garantie que les langages produisent la même IL pour un code équivalent. Je peux donc dire sans me tromper qu'il n'y a aucune garantie que tous les langages .NET soient aussi performants.

Cependant, s'ils produisent le même résultat de VA, il n'y a pas de différence.

7voto

Tomas Petricek Points 118959

Tout d'abord, le large éventail de langages de la plate-forme .NET contient sans aucun doute des langages qui génèrent du code avec des performances différentes, de sorte que tous les langages ne sont pas également performants. Ils compilent tous dans le même langage intermédiaire (IL), mais le code généré peut être différent, certains langages peuvent s'appuyer sur Reflection ou le Dynamic Language Runtime (DLR), etc.

Cependant, il est vrai que la BCL (et les autres bibliothèques utilisées par les langages) auront les mêmes performances quel que soit le langage à partir duquel vous les appelez. Cela signifie que si vous utilisez une bibliothèque qui effectue des calculs coûteux ou un rendu sans faire vous-même des calculs complexes, le langage dans lequel vous l'appelez n'a pas vraiment d'importance.

Je pense que la meilleure façon d'aborder le problème n'est pas de penser aux langages, mais aux différentes fonctionnalités et styles de programmation disponibles dans ces langages. Voici une liste de quelques-unes d'entre elles :

  • Code non sécurisé : Vous pouvez utiliser du code non sécurisé en C++/CLI et, dans une certaine mesure, également en C#. C'est probablement la manière la plus efficace d'écrire certaines opérations, mais vous perdez certaines garanties de sécurité.

  • Impératif, typage statique : C'est le style de programmation habituel en C# et VB.Net, mais vous pouvez également utiliser le style impératif de F#. Notamment, de nombreuses fonctions récursives sont compilées en code IL impératif et statiquement typé, ce qui s'applique également à certaines fonctions F#.

  • typée statiquement, fonctionnelle : Ceci est utilisé par la plupart des programmes F#. Le code généré est largement différent de ce que impératif mais elle est toujours typée statiquement, ce qui n'entraîne pas de perte de performance significative. Comparaison de impératif y fonctionnel est quelque peu difficile car l'implémentation optimale semble très différente dans les deux versions.

  • Typage dynamique : Des langages comme IronPython et IronRuby utilisent un runtime de langage dynamique, qui met en œuvre des appels de méthodes dynamiques, etc. C'est un peu plus lent que le code statiquement typé (mais le DLR est optimisé à bien des égards). Notez que le code écrit en utilisant C# 4.0 dynamic entre également dans cette catégorie.

Il existe de nombreuses autres langues qui n'entrent dans aucune de ces catégories, mais je pense que la liste ci-dessus couvre la plupart des cas courants (et certainement tous les langages Microsoft).

4voto

kvb Points 35490

Je suis sûr qu'il existe des scénarios dans lesquels un code idiomatique est légèrement plus performant lorsqu'il est écrit dans un langage .NET plutôt que dans un autre. Cependant, en prenant un peu de recul, pourquoi est-ce important ? Avez-vous un objectif de performance à l'esprit ? Même dans un seul langage, il y a souvent des choix que vous pouvez faire et qui affectent les performances, et vous aurez parfois besoin d'échanger les performances contre la maintenabilité ou le temps de développement. Si vous n'avez pas d'objectif quant à ce qui constitue des performances acceptables, il est impossible d'évaluer si les différences de performances entre les langages sont significatives ou négligeables.

En outre, les compilateurs évoluent, de sorte que ce qui est vrai aujourd'hui pour les performances relatives ne le sera pas nécessairement à l'avenir. Et le compilateur JIT évolue également. Même la conception des processeurs est variable et évolue, de sorte que le même code natif JITT peut avoir des performances différentes sur des processeurs ayant des hiérarchies de cache, des tailles de pipeline, des prédictions de branchement, etc. différentes.

Cela dit, il y a probablement quelques règles générales qui s'appliquent dans une large mesure :

  1. Les différences d'algorithme vont probablement faire une plus grande différence que les différences de compilateur (au moins quand on compare des langages typés statiquement fonctionnant avec le CLR).
  2. Pour les problèmes qui peuvent être facilement parallélisés, les langages qui permettent de tirer facilement parti de plusieurs processeurs/cores fourniront un moyen simple d'accélérer votre code.

2voto

Dean Harding Points 40164

A la fin de la journée, todo Les langages de programmation sont compilés dans le code machine natif de l'unité centrale sur laquelle ils sont exécutés, de sorte que les mêmes questions peuvent être posées pour n'importe quel langage (et pas seulement pour ceux qui sont compilés en MSIL).

Pour les langages qui ne sont essentiellement que des variantes syntaxiques les uns des autres (par exemple C# vs VB.NET), je ne m'attendrais pas à ce qu'il y ait une grande différence. Mais si les langages sont trop divergents (par exemple C# vs F#), on ne peut pas vraiment faire de comparaison valable car on ne peut pas vraiment écrire deux langages "équivalents". non trivial des échantillons de code dans les deux langues de toute façon.

0voto

Siyfion Points 404

Le langage peut être considéré comme le "frontal" du code IL, de sorte que la seule différence entre les langages est de savoir si le compilateur produira le même code IL ou un code moins efficace ou plus efficace.

D'après ce que j'ai lu en ligne, il semble que le compilateur C++ géré soit celui qui optimise le mieux le code IL, mais je n'ai rien vu qui montre une différence remarquable entre les principaux langages C#/C++/VB.NET.

Vous pourriez même essayer de compiler les éléments suivants en IL et y jeter un coup d'œil ?

F#

#light
open System
printfn "Hello, World!\n"
Console.ReadKey(true)

C#

// Hello1.cs
public class Hello1
{
    public static void Main()
    {
        System.Console.WriteLine("Hello, World!");
        System.Console.ReadKey(true);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X