Java Double vs double: type de classe vs type primitif

J'étais curieux de ce que les différences de performances entre Java de la classe et de type primitif pour double ont été. J'ai donc créé un petit benchmark et trouvé le type de classe à être 3x-7x plus lent que le type primitif. (3x sur la machine locale OSX, 7x sur ideone)

Voici le test:

class Main {
    public static void main(String args[]) {
        long bigDTime, littleDTime;

        {
            long start = System.nanoTime();
            Double d = 0.0;
            for (Double i = 0.0; i < 1432143.341; i += 0.1) {
                d += i;
            }
            long end = System.nanoTime();
            bigDTime = end - start;
            System.out.println(bigDTime);
        }

        {
            long start = System.nanoTime();
            double d = 0.0;
            for (double i = 0.0; i < 1432143.341; i += 0.1) {
                d += i;
            }
            long end = System.nanoTime();
            littleDTime = end - start;
            System.out.println(littleDTime);
        }

        System.out.println("D/d = " + (bigDTime / littleDTime));
    }
}

http://ideone.com/fDizDu

Alors pourquoi est le Double de type beaucoup plus lent? Pourquoi est-il mis en œuvre pour permettre aux opérateurs mathématiques?

Il est lent en raison de la nécessité de la boîte et unbox. Ce comportement est normal.
Qui fait sens, mais il semble quand même beaucoup de frais généraux.
Il y a beaucoup de frais généraux. Et pour cette raison, vous devez éviter l'utilisation de primitif types dans le temps de code critique.
Le coût est plus élevé pour les programmes multi-thread. C'est parce que l'utilisation de Double est littéralement remplir les caches avec des déchets, ce qui va ralentir les autres threads dans la plupart des cas.

OriginalL'auteur Patrick Lorio | 2013-03-23