Enrubanneuse de types primitifs dans arraylist vs tableaux
-
14-10-2019 - |
Question
"java base 1" J'ai lu
ATTENTION: Un ArrayList est loin moins efficace qu'un tableau int [] parce que chaque valeur est séparément enveloppé à l'intérieur d'un objet. vous feriez veulent seulement utiliser cette construction pour petites collections lorsque programmeur commodité est plus important que efficacité.
Mais dans mon logiciel, je l'ai déjà utilisé Arraylist au lieu de tableaux normaux en raison de certaines exigences, bien que « Le logiciel est censé avoir la haute performance et après que j'ai lu le texte cité j'ai commencé à paniquer! » une chose que je peux changer est de changer les variables doubles à double afin d'éviter la boxe automatique et je ne sais pas si cela vaut la peine ou non, dans l'algorithme échantillon suivant
public void multiply(final double val)
{
final int rows = getSize1();
final int cols = getSize2();
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
this.get(i).set(j, this.get(i).get(j) * val);
}
}
}
Ma question est en train de changer ne double à double fait une différence? ou qui est un micro optimisation qui n'affectera rien? garder à l'esprit que je pourrais être CONSIDÉRABLEMENT matrices.2nd Devrais-je considère redessiner à nouveau l'ensemble du programme?
La solution
Le grand problème avec double
par rapport Double
est que celui-ci ajoute une certaine quantité de surcharge de mémoire - 8 octets par objet sur une machine virtuelle Java Sun 32 bits, peut-être plus ou moins sur d'autres. Ensuite, vous avez besoin d'un autre 4 octets (8 sur une machine virtuelle Java 64 bits) pour faire référence à l'objet.
Donc, en supposant que vous avez 1.000.000 objets, les différences sont les suivantes:
double[1000000]
8 octets par entrée; Total = 8.000.000 octets
Double[1000000]
16 octets par instance d'objet + 4 octets par référence; Total = 20.000.000 octets
Si oui ou non cette question est importante dépend beaucoup de votre application. À moins que vous vous retrouvez à court de mémoire, on suppose qu'il n'a pas d'importance.
Autres conseils
Il change l'endroit où autoboxing arrive, mais rien d'autre.
2 - Non, ne vous inquiétez pas à ce sujet. Il est peu probable d'être un goulot d'étranglement. Vous pouvez faire quelques points de repère pour mesurer pour la taille de vos données, pour prouver que la différence est insignifiante en ce qui concerne les performances de votre application.
Double est nettement plus cher que le double, mais dans 90% des cas, il n'a pas d'importance.
Si vous voulez une classe de matrice efficace, je vous suggère d'utiliser l'une des bibliothèques qui déjà font efficacement. par exemple. Jama.
Modification de l'argument double
dans Double
ne va pas aider beaucoup, il aggravera légèrement les performances, car il doit être Unboxed pour la multiplication.
Qu'est-ce que l'aide empêche plusieurs appels à get()
comme dans:
for (int i = 0; i < rows; i++)
{
List row = this.get(i);
for (int j = 0; j < cols; j++)
{
row.set(j, row.get(j) * val);
}
}
(d'ailleurs, je deviné le type de ligne.)
En supposant que vous utilisez une liste de listes, en utilisant itérateurs au lieu de geting et réglage par indices de boucle va gagner un peu plus de performance.