Alors que System.arraycopy
est implémenté de manière native, et peut donc être 1 plus rapide qu'une boucle Java, il n'est pas toujours aussi rapide qu'on pourrait le penser. Prenons cet exemple :
Object[] foo = new Object[]{...};
String[] bar = new String[foo.length];
System.arraycopy(foo, 0, bar, 0, bar.length);
Dans ce cas, le foo
y bar
Les tableaux ont des types de base différents, de sorte que l'implémentation de la fonction arraycopy
doit vérifier le type de chaque référence copiée pour s'assurer qu'il s'agit bien d'une référence à une instance de String. Cela est nettement plus lent qu'une simple méthode de style C. memcopy
du contenu du tableau.
L'autre point est que Arrays.copyOf
utiliza System.arraycopy
sous le capot. C'est pourquoi System.arraycopy
es à première vue ne devrait pas être plus lent 2 que Arrays.copyOf
. Mais vous pouvez voir (à partir du code cité au-dessus de ) que Arrays.copyOf
utilisera dans certains cas la réflexion pour créer le nouveau tableau. La comparaison des performances n'est donc pas simple.
Cette analyse présente quelques failles.
-
Nous examinons le code d'implémentation d'une version spécifique de Java. Ces méthodes peuvent changer, invalidant les hypothèses précédentes sur l'efficacité.
-
Nous ignorons la possibilité que le compilateur JIT puisse effectuer une optimisation intelligente des cas particuliers pour ces méthodes. Et il semble que cela se produise avec Arrays.copyOf
; voir Pourquoi Arrays.copyOf est-il 2 fois plus rapide que System.arraycopy pour les petits tableaux ? . Cette méthode est "intrinsèque" dans les implémentations Java de la génération actuelle, ce qui signifie que le compilateur JIT ignorera ce qui se trouve dans le code source Java !
Mais de toute façon, le différence entre les deux versions est O(1)
(c'est-à-dire indépendante de la taille du tableau) et relativement petite. Par conséquent, je vous conseille d'utiliser la version qui rend votre code le plus facile à lire, et de ne vous préoccuper de la version la plus rapide que dans les cas suivants profilage vous dit que ça compte.
1 - Il podría être plus rapide, mais il est également possible que le compilateur JIT fait un si bon travail d'optimisation d'une boucle codée à la main qu'il n'y a aucune différence.
2 votes
Qu'est-ce que "Bloch" ? Pourquoi cet extrait de code est-il pertinent ?
9 votes
@Ciro Bloch est le gars qui a écrit l'implémentation de ArrayList.
1 votes
Voir aussi : stackoverflow.com/q/44487304/14955