J'ai une interface pour diverses raisons (principalement parce que j'utilise cela avec MATLAB et MATLAB poignées int [] ) Je dois retourner une matrice plutôt qu'une liste. P> Je ne veux pas que mes classes de mise en œuvre renvoient la matrice [] car elle est mutable. Quel est le moyen le plus efficace de copier un ensemble int [] (tailles dans la plage de longueur 1000-1000000)? Est-ce dataseries code> avec une méthode clone () code>? P> p>
3 Réponses :
http://www.javapractices.com/topic/topicaction.do ? Id = 3 p>
Les chiffres seront probablement différents selon vos spécifications, mais il semble que Clone est le meilleur choix. P>
La seule alternative est Tableaux # CopieOf () Code> (qui utilise Système # ArrayCyPy () < / Code> sous les hottes).
Just Testez-le. P> et quand La différence est négligeable. Je dirais, il suffit d'aller pour test1 () code> et test2 () code> sont échangés: p> clone () code> car c'est mieux lisible et tableaux # copine () code> est uniquement Java 6. P>
Vraiment bizarre ... L'article que j'ai publié a une copie à 2 fois plus lentement que le clone. Malheureusement, je n'ai pas de JDK sur cette machine ou je pourrais courir un test moi-même. Mais de toute façon +1 pour avoir fait votre propre test.
Me battre à ça. Était sur le point de courir mon propre test. @Ballusc, que si elle est exécutée avec des valeurs aléatoires? Ne vous attendez pas à ce que cela fasse vraiment une différence, mais le tableau que vous êtes clonant est uniformément distribué.
@jonathan: Peut dépendre de la plate-forme et de la JVM utilisée.
@Finbarr: remplir chaque INT avec Random # NEXTINT () CODE> CODES 20046 CODE> ET 20032 CODE> MS. Aucune différence notable.
Maintenant, vous oubliez d'importer java.Util.random; :) téléchargé JDK et testé - 16140 et 17047 sur mon ordinateur. Semble clone est plus rapide pour moi ... mais pas 2 fois aussi vite.
Suggérer Static Void test1 (int [] INTS, INT REPS) {pour (int i = 0; i
À tous les micro-benchmarkers ... méfiez-vous des effets d'échauffement JVM b>. Enveloppez votre microbenchmark dans une méthode et appelez-la dans une boucle à quelques reprises et ignorez les résultats avant la stabilisation.
@Stephen: C'est exactement la raison pour laquelle j'ai ajouté un résultat lorsque les méthodes sont échangées.
@Ballusc - Tu me manques mon point. Vous devez appeler test1 code> et test2 code> plusieurs fois.
Les gars, la microbenchmarking est beaucoup plus difficile que cela. Je ne ferais pas confiance à ces résultats. code.google.com/p/caliper/wiki/javamicRobenchmarks
Personne n'a jamais résolu les problèmes de performance de leurs applications en passant par la traversée et en modifiant les appels arraycopy () vers cloné () ou vice versa. p> li>
Il n'y a pas une réponse définitive à cette question. Ce n'est pas seulement que pourrait em> être différent sur différents VMS, versions, systèmes d'exploitation et matériel: c'est vraiment est em> différent. P> li>
Je l'a aspiré de toute façon, sur une openJDK très récente (sur une récente ubuntu) et j'ai constaté que arraycopy code> est beaucoup em> plus vite. Voilà-y ma réponse à vous? NON! Parce que si cela s'avère vrai, il y a un bug avec la intrinsification de des tableaux.copyof code> et que le bogue sera probablement corrigé, de sorte que ces informations ne vous sont que transitoires. P> LI >
ol>