L'Efficacité Du Système.arraycopy sur les tableaux multidimensionnels
Je suis conscient que la performance en commun refactoring consiste à remplacer le simple for
's par System.arraycopy.
Je voudrais vous interroger sur:
-
Quand le système.arraycopy commencer à faire sens (étant donné que c'est un natif de l'appel de méthode). Ne copie de petites choses dire, < 32 ont tout avantage?
-
C'est mon impression, ou n'est-il pas possible de copier (efficacement) un cycle comme ça avec arraycopy:
for (int j = 0; j < 2; ++j) { vpr[m][s + j][i] = vr[j]; }
Si vous êtes absolument fou sur la performance, (vous ne devriez pas être à moins que vous étalonnés et identifié un goulot d'étranglement) on peut souvent remplacer un tableau multidimensionnel avec un tableau à une dimension.
OriginalL'auteur i30817 | 2010-01-14
Vous devez vous connecter pour publier un commentaire.
System.arrayCopy
est probablement le moyen le plus rapide pour copier un tableau, mais il n'a pas de profondeur de copies.Elle ne peut pas faire l'exemple plus complexe dans votre deuxième question.
OriginalL'auteur Thilo
Il n'est pas difficile à utiliser le Système.arraycopy pour faire un rapide copie en profondeur. Voici un exemple pour un tableau 2D:
À partir d'un rapide test de chronométrage, utilisez-la pour copier un 1000x1000 tableau 2D de 100 fois en 40 millisecondes, contre 1740 millisecondes à l'aide de la plus évidente des deux boucles for et de l'affectation.
OriginalL'auteur adammtlx
Comme toutes les performances de synchronisation des questions, vous avez vraiment besoin de point de repère dans l'environnement où vous vous attendez à l'exécution de votre code. Les différentes versions de la JVM et du matériel (PROCESSEUR, mémoire, etc) configurations peuvent avoir des résultats différents. Cela dépend vraiment de vos exigences de performances spécifiques.
Mais ensuite, avant d'arriver à ce niveau de performance de réglage, vous devez d'abord écrire le code clairement et de faire bon du premier. Et au compilateur JIT sera capable de beaucoup d'optimisations pour vous avec la normale de l'algorithme expressions, mais parfois à la main optimisations peuvent confondre ces automatisé des optimisations. Après vous avez un produit de travail et si la performance n'est pas ce que vous voulez, puis profil et de travailler sur les points chauds. (Bien que parfois pour un code plus complexe, vous pouvez avoir besoin de revoir et/ou de modifier votre logique.)
Dans ce cas, si vous la copie des tableaux entiers puis utilisez
System.arraycopy
que c'est la façon standard de le faire. Le compilateur peut maintenant ou à l'avenir fournir des optimisations supplémentaires pour que, depuis la base Api compter sur cette lourdement, vous pouvez être assuré que c'est quelque chose que la JVM développeurs voulez toujours avoir un fonctionnement optimal.Vous aurez besoin de courir à travers quelques boucles, bien que depuis
System.arraycopy
ne peut faire un seul tableau d'objet et Java multi-dimension des tableaux sont vraiment des tableaux de tableaux. Alors...Ou vous pouvez utiliser
Arrays.copyOf
qui utiliseSystem.arraycopy
et un peu de réflexion à l'interne (si n'est pas aussi rapide que d'utiliser directementSystem.arraycopy
vous-même), mais ne permet pas de faire une copie en profondeur.OriginalL'auteur Kevin Brock
Autant que je sache, Système.arrayCopy est le plus efficace et le meilleur moyen pour copier vos tableaux. Je ne suis pas au courant de toutes les situations où l'autre façon de mettre en œuvre vos propres boucles serait beaucoup plus efficace pour les copies directes.
OriginalL'auteur Sands
Dans mon cas d'utilisation de cette
était façon plus rapide que l'utilisation
System.arraycopy
ou la droite de l'avant deuxfor
boucles solution.Testé aussi avec les primitives (
arrayCopy(int[][] array)
) et a obtenu le même résultat.OriginalL'auteur c0der