Maison >Java >javaDidacticiel >ArrayList to Array : Pourquoi `toArray(new MyClass[0])` est-il plus rapide que `toArray(new MyClass[myList.size()])` ?
L'énigme du tableau : .toArray(new MyClass[0]) vs .toArray(new MyClass[myList.size()])
Lorsqu'il s'agit d'ArrayLists, il est souvent nécessaire de les convertir en tableaux. Pour ce faire, on peut utiliser l'une ou l'autre de ces deux techniques :
// Option 1: Specify Array Size MyClass[] arr = myList.toArray(new MyClass[myList.size()]); // Option 2: Blank Array MyClass[] arr = myList.toArray(new MyClass[0]);
En termes de performances, un constat inattendu est apparu : sur Hotspot 8, l'utilisation d'un tableau vide surpasse étonnamment la version prédimensionnée :
Benchmark (n) Mode Samples Score Error Units c.a.p.SO29378922.preSize 1 avgt 30 0.025 ▒ 0.001 us/op c.a.p.SO29378922.preSize 100 avgt 30 0.155 ▒ 0.004 us/op c.a.p.SO29378922.preSize 1000 avgt 30 1.512 ▒ 0.031 us/op c.a.p.SO29378922.preSize 5000 avgt 30 6.884 ▒ 0.130 us/op c.a.p.SO29378922.preSize 10000 avgt 30 13.147 ▒ 0.199 us/op c.a.p.SO29378922.preSize 100000 avgt 30 159.977 ▒ 5.292 us/op c.a.p.SO29378922.resize 1 avgt 30 0.019 ▒ 0.000 us/op c.a.p.SO29378922.resize 100 avgt 30 0.133 ▒ 0.003 us/op c.a.p.SO29378922.resize 1000 avgt 30 1.075 ▒ 0.022 us/op c.a.p.SO29378922.resize 5000 avgt 30 5.318 ▒ 0.121 us/op c.a.p.SO29378922.resize 10000 avgt 30 10.652 ▒ 0.227 us/op c.a.p.SO29378922.resize 100000 avgt 30 139.692 ▒ 8.957 us/op
Le compilateur JVM et JIT optimise la création et l'initialisation de nouveaux tableaux correctement dimensionnés. Cependant, ces optimisations ne peuvent pas être appliquées aux tableaux créés par l'utilisateur. Par conséquent, l'utilisation d'un tableau vide permet à la JVM d'effectuer ces optimisations, ce qui entraîne des performances améliorées.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!