6
votes

Java: Un moyen le plus efficace de copier de manière défensive un int []?

J'ai une interface dataseries avec une méthode xxx

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.

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 clone () ?


0 commentaires

3 Réponses :


1
votes

http://www.javapractices.com/topic/topicaction.do ? Id = 3

Les chiffres seront probablement différents selon vos spécifications, mais il semble que Clone est le meilleur choix.


0 commentaires

7
votes

La seule alternative est Tableaux # CopieOf () (qui utilise Système # ArrayCyPy () < / Code> sous les hottes).

Just Testez-le. xxx xxx

et quand test1 () et test2 () sont échangés: xxx

La différence est négligeable. Je dirais, il suffit d'aller pour clone () car c'est mieux lisible et tableaux # copine () est uniquement Java 6.


10 commentaires

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 () CODES 20046 ET 20032 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 (et similaire pour Test2)


À tous les micro-benchmarkers ... méfiez-vous des effets d'échauffement JVM . 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 et test2 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



7
votes
  1. 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.

  2. Il n'y a pas une réponse définitive à cette question. Ce n'est pas seulement que pourrait être différent sur différents VMS, versions, systèmes d'exploitation et matériel: c'est vraiment est différent.

  3. 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 est beaucoup 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 et que le bogue sera probablement corrigé, de sorte que ces informations ne vous sont que transitoires.


0 commentaires