Moyen le plus efficace pour mettre à l'échelle un tableau en Java?
(Toutes mes excuses si cela a été demandé avant - je ne peux pas croire qu'il n'a pas, mais je ne pouvais pas en trouver un. Peut-être que ma recherche-fu est faible.)
Pendant des années, j'ai "connu" que Java n'a pas de fonction native à l'échelle d'un tableau (c'est à dire multiplier chaque élément par une constante). J'ai donc fait ceci:
for (int i=0; i<array.length; i++) {
array[i] = array[i] * scaleFactor;
}
Est-ce en fait le moyen le plus efficace (dans la présente demande, par exemple, c'est un tableau d'environ 10000 doubles)? Ou est-il un meilleur moyen?
source d'informationauteur Ian Renton
Vous devez vous connecter pour publier un commentaire.
L'air tout à fait bien pour moi. Je ne peux pas penser à un moyen plus efficace. Évidemment essayer de mettre ce code dans un seul endroit, plutôt que d'avoir le code dans tous les sens, mais à part ça, pas de problèmes évidents.
Seule suggestion que je peux vous offrir est paresseusement à l'échelle selon lequel vous ne payez que le coût de la multiplication sur l'accès à chaque élément; par exemple,
Évidemment, c'est seulement de mieux dans certaines situations:
Dans d'autres situations, il s'agit d'un micro-optimisation de la pas de réel avantage sur les Processeurs modernes.
La "meilleure façon" est d'écrire
array[i] *= scaleFactor;
au lieu dearray[i] = array[i] * scaleFactor;
. 🙂Vraiment, c'est juste du sucre syntaxique - la compilation de sortie (et donc de la performance) doit être exactement le même. Comme Jon dit, vous n'allez pas être en mesure d'obtenir des meilleures performances, mais personnellement, je vais prendre une réduction de taper toute la journée.
Seule chose que je peux penser à ajouter en plus d'Adamski et Jon Skeet est que si elle arrive à être un tableau d'entiers/longs et que vous êtes à la mise à l'échelle par une puissance de 2, alors vous pourriez obtenir une légère amélioration par l'utilisation de bitshift opérateurs. YMMV si, puisqu'il dépend du compilateur (et peut-être même de la VM).
Vous pourriez travailler avec les fils, à réduire la durée d'exécution, mais la ligne de fond est que vous devez inclure ce code et de laisser chaque thread à exécuter une partie de la boucle de sorte que le programme résultant est aussi efficace que le vôtre; c'est juste plus rapide
Semble optimale pour moi.
Ne tombez pas pour de faux optimisations comme la déclaration de la longueur du tableau, dans un dernier champ en dehors de la boucle. Cela fonctionne pour les Collections en évitant de répéter les appels de méthode à .taille() et les Chaînes d'éviter les appels de méthode à .longueur (), mais sur un tableau .la longueur est déjà un public final terrain.
Aussi, la boucle vers l'arrière vers le zéro peut être un langage d'assemblage d'optimisation, mais dans un langage de haut niveau comme Java, la machine virtuelle prendra soin de toute évidence tweaks.
Dans Java 8: