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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top