Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Influence du paramétrage des collections sur les performances

8 réponses
Avatar
Jean-Baptiste LE DUIGOU
Depuis la version 5 de Java il est possible (et recommand=E9) de
param=E9tr=E9 les collections en sp=E9cifiant le type des instances qu'elle
va contenir.
Est-ce que ce param=E9trage =E0 des cons=E9quence significative sur les
performances d'une application ?

Merci d'avance pour vos r=E9ponses.

8 réponses

Avatar
Mayeul
Jean-Baptiste LE DUIGOU wrote:
Depuis la version 5 de Java il est possible (et recommandé) de
paramétré les collections en spécifiant le type des instances qu'elle
va contenir.
Est-ce que ce paramétrage à des conséquence significative sur les
performances d'une application ?



Non. De manière générale, avec ou sans l'utilisation des génériques, le
bytecode généré est le même, donc pas de différence à l'exécution.

Les génériques sont un outil pour la phase de compilation, qui sert à
mieux assurer le typage des données. Et à éviter des millions de cast
explicites.


--
Mayeul
Avatar
Alain Ketterlin
Jean-Baptiste LE DUIGOU writes:

Est-ce que ce paramétrage à des conséquence significative sur les
performances d'une application ?



Oui cela aura une incidence. Quand a savoir si elle est significative...
L'utilisation des génériques permet au compilateur de vérifi er mieux le
typage du reste du programme, donc il évite des casts explicites, qui du
coup n'ont plus lieu à l'exécution.

Donc un programme avec des génériques sera au moins aussi efficac e que
le même programme sans génériques.

-- Alain.
Avatar
Xavier Nayrac
Alain Ketterlin a écrit :
Jean-Baptiste LE DUIGOU writes:

Est-ce que ce paramétrage à des conséquence significative sur les
performances d'une application ?



Oui cela aura une incidence. Quand a savoir si elle est significative...
L'utilisation des génériques permet au compilateur de vérifier mieux le
typage du reste du programme, donc il évite des casts explicites, qui du
coup n'ont plus lieu à l'exécution.



Bonjour,
Il me semble qu'il y a une contradiction évidente entre ta réponse et
celle fournie par Mayeul...

En regardant ici
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
on peut lire, entre autre :

"Generics are implemented by type erasure: generic type information is
present only at compile time, after which it is erased by the compiler."

Donc si je comprends bien et que je n'ai pas raté de points importants
dans le reste du texte, on peut conclure que les génériques ne change
rien en ce qui concerne l'exécution.


Donc un programme avec des génériques sera au moins aussi efficace que
le même programme sans génériques.



devient donc : un programme sera tout aussi efficace (ou inefficace)
avec ou sans génériques :-)

--
Xavier Nayrac
http://personalbugtracker.free.fr
Avatar
Mayeul
Xavier Nayrac wrote:
Alain Ketterlin a écrit :
Jean-Baptiste LE DUIGOU writes:

Est-ce que ce paramétrage à des conséquence significative sur les
performances d'une application ?



Oui cela aura une incidence. Quand a savoir si elle est significative...
L'utilisation des génériques permet au compilateur de vérifier mieux le
typage du reste du programme, donc il évite des casts explicites, qui du
coup n'ont plus lieu à l'exécution.



Bonjour,
Il me semble qu'il y a une contradiction évidente entre ta réponse et
celle fournie par Mayeul...

En regardant ici
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
on peut lire, entre autre :

"Generics are implemented by type erasure: generic type information is
present only at compile time, after which it is erased by the compiler."

Donc si je comprends bien et que je n'ai pas raté de points importants
dans le reste du texte, on peut conclure que les génériques ne change
rien en ce qui concerne l'exécution.



Tout à fait.

La raison étant, que les casts se font toujours quand on utilise les
génériques. Il est toujours nécessaire de vérifier qu'un objet est bien
de type attendu à l'exécution.

La différence, entre l'utilisation ou non des génériques, est que les
casts sont implicites avec les génériques : on n'a pas besoin de les
taper dans le code source.

--
Mayeul
Avatar
Alain Ketterlin
Mayeul writes:

Xavier Nayrac wrote:



"Generics are implemented by type erasure: generic type information
is present only at compile time, after which it is erased by the
compiler."

Donc si je comprends bien et que je n'ai pas raté de points
importants dans le reste du texte, on peut conclure que les
génériques ne change rien en ce qui concerne l'exécution.





Ah oui, tiens. Mon raisonnement était le suivant : comme c'est le
compilateur qui génère le code, et que lui sait qu'il n'y a pas l ieu de
vérifier, il pourrait éviter le cast. Dans la pratique ce n'est
effectivement pas le cas, le code est le même, qu'on utilise des
génériques ou pas (avec le jdk Sun du moins).

La raison étant, que les casts se font toujours quand on utilise les
génériques. Il est toujours nécessaire de vérifier qu 'un objet est
bien de type attendu à l'exécution.



Je ne comprends pas pourquoi c'est nécessaire. J'ai l'impression qu'on
pourrait tranquillement virer des tas de checkcast.

Quelqu'un a une idée ?

-- Alain.
Avatar
Alain Ketterlin
Xavier Nayrac writes:

Alain Ketterlin a écrit :
La raison étant, que les casts se font toujours quand on utilise l es
génériques. Il est toujours nécessaire de vérifier qu'un objet est
bien de type attendu à l'exécution.



Je ne comprends pas pourquoi c'est nécessaire. J'ai l'impression qu 'on
pourrait tranquillement virer des tas de checkcast.

Quelqu'un a une idée ?





Ici : http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
Le chapitre 6 devrait répondre à ta question.



Ah ouais. Bon ben je suis très déçu, j'aurais préfà ©ré ne pas avoir de
compatibilité entre type raw et type générique, mais qu'au m oins on
gagne quelque chose au-delà du compilo.

-- Alain.
Avatar
Alain Ketterlin
Mayeul writes:

Alain Ketterlin wrote:



Je ne comprends pas pourquoi c'est nécessaire. J'ai l'impression qu 'on
pourrait tranquillement virer des tas de checkcast.

Quelqu'un a une idée ?





[...]
List myList = new LinkedList();
List<Integer> myIntList = myList; //génère un warning, mais e st
autorisé pour compatibilité avec 1.4



Ah ben voilà, je croyais que ça c'était interdit. Dommage qu e ça ne le
soit pas. Merci pour l'exemple.

-- Alain.
Avatar
Alain Ketterlin
Xavier Nayrac writes:

Ah ouais. Bon ben je suis très déçu, j'aurais préf éré ne pas avoir de
compatibilité entre type raw et type générique, mais qu'a u moins on
gagne quelque chose au-delà du compilo.





C'est un point de vue, mais qui semble difficile à défendre, no n ?

D'un coté, gagner quelques millisecondes sur la durée de l'ex écution
d'un programme, en se coupant d'une partie du code existant ;



Oui, c'est une question de point de vue. Le reprise de l'existant est
certes importante, mais là les restrictions se propagent même lor squ'on
utilise exclusivement des génériques (il suffirait d'interdire
l'aliasing generic=raw, d'ailleurs, ce qui ne devrait pas impacter le
code existant -- qui n'utilise pas de generic). Et c'est peut-être
quelque millisecondes pour le checkcast, mais surtout ça risque de
rendre pénible des tas d'optimisations sur le bytecode (à cause de
l'éventuelle exception).

de l'autre, gagner en lisibilité, trouver des erreurs plus rapidemen t et
continuer à utiliser les bibliothèques non "générifi ées".



Attention, je ne suis pas contre les génériques, j'en voudrais m ême
beaucoup plus :-)

-- Alain.