37 votes

Les génériques C# ont-ils un avantage en termes de performances ?

J'ai un certain nombre de classes de données représentant diverses entités.

Qu'est-ce qui est le mieux : écrire une classe générique (par exemple, pour imprimer ou produire du XML) en utilisant les génériques et les interfaces, ou écrire une classe séparée pour traiter chaque classe de données ?

Y a-t-il un avantage en termes de performance ou un autre avantage (autre que le fait d'économiser le temps d'écrire des classes séparées) ?

59voto

Danimal Points 5721

Il y a un avantage significatif de performance à utiliser les génériques - vous vous débarrassez de boxe et unboxing . Par rapport au développement de vos propres classes, c'est un jeu de pile ou face (avec un côté de la pièce qui pèse plus que l'autre). Ne développez vos propres classes que si vous pensez pouvoir surpasser les auteurs du framework.

20voto

Jason Short Points 4034

Pas seulement oui, mais HECK YES. Je ne croyais pas à la différence qu'ils pouvaient faire. Nous avons effectué des tests dans VistaDB après la réécriture d'un petit pourcentage du code principal qui utilisait des ArrayLists et des HashTables pour les remplacer par des génériques. L'amélioration de la vitesse était de 250 % ou plus.

Lisez mon blog sur les essais nous avons fait sur les génériques contre les collections de type faible. Les résultats nous ont époustouflés.

J'ai commencé à réécrire beaucoup d'anciens codes qui utilisaient des collections faiblement typées en collections fortement typées. L'un de mes plus gros problèmes avec l'interface ADO.NET est qu'ils n'exposent pas de moyens plus fortement typés pour entrer et sortir des données. Le temps de transfert d'un objet vers un autre et vice-versa est absolument fatal pour les applications à fort volume.

Un autre effet secondaire du typage fort est que vous trouverez souvent des problèmes de références faiblement typées dans votre code. Nous avons constaté qu'à travers mise en œuvre des structures dans certains cas, pour éviter de mettre la pression sur le GC, nous pourrions accélérer davantage notre code. Combinez cela avec un typage fort pour obtenir une meilleure vitesse.

Il est parfois nécessaire d'utiliser des interfaces faiblement typées au sein du runtime dot net. Dans la mesure du possible, cherchez des moyens de rester fortement typés. Cela fait vraiment une énorme différence dans les performances des applications non triviales.

15voto

Andrew Queisser Points 883

Les types génériques en C# sont véritablement des types génériques du point de vue du CLR. Il ne devrait pas y avoir de différence fondamentale entre les performances d'une classe générique et d'une classe spécifique qui fait exactement la même chose. Cette approche diffère de celle des génériques Java, qui sont davantage un moulage automatisé des types lorsque cela est nécessaire, ou des modèles C++ qui se développent au moment de la compilation.

Voici un bon article, un peu ancien, qui explique la conception de base : "Conception et mise en œuvre de génériques pour le .NET Common Language Runtime " .

Si vous écrivez à la main des classes pour des tâches spécifiques, il y a de fortes chances que vous puissiez optimiser certains aspects pour lesquels vous auriez besoin de détours supplémentaires par une interface de type générique.

En résumé, il peut y avoir un avantage en termes de performances, mais je recommanderais d'abord la solution générique, puis l'optimisation si nécessaire. Cela est particulièrement vrai si vous prévoyez d'instancier le générique avec de nombreux types différents.

7voto

torial Points 9883

J'ai fait une analyse comparative simple sur les listes de type ArrayList par rapport aux listes génériques pour une autre question : Génériques et listes de tableaux La liste générique était 4,7 fois plus rapide que la liste matricielle.

Donc oui, la mise en boîte et le déballage sont essentiels. si vous faites beaucoup d'opérations. Si vous faites de simples opérations CRUD, je ne m'en préoccuperais pas.

6voto

Hristo Deshev Points 694

Les génériques sont un des moyens de paramétrer le code et d'éviter les répétitions. En regardant la description de votre programme et votre idée d'écrire une classe séparée pour traiter chaque objet de données, je pencherais pour les génériques. Le fait qu'une seule classe s'occupe de plusieurs objets de données, au lieu de plusieurs classes qui font la même chose, augmente vos performances. Et bien sûr, vos performances, mesurées par la capacité à modifier votre code, sont généralement plus importantes que celles de l'ordinateur :-)

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