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));
}
}
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
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
Vous devez vous connecter pour publier un commentaire.
Parce que la valeur est enveloppé à l'intérieur d'un objet qui a besoin de l'allocation, de libération de la mémoire, gestion de la mémoire plus que les accesseurs et mutateurs
Parce que autobox est destiné à vous permettre d'utiliser ces wrappers sans se soucier du fait qu'ils ne sont pas de la plaine des valeurs. Préféreriez-vous ne pas être en mesure d'avoir un
ArrayList<Double>
? La Performance est pas toujours nécessaire et une goutte de 3x-7x de performance en fonction des situations peut-être acceptable. L'optimisation est une exigence qui n'est pas toujours présent.Cela est vrai dans toutes les situations, à l'aide d'un
LinkedList
à accès aléatoire éléments pourraient être exagéré, mais cela ne signifie pas queLinkedList
ne devrait pas être mis en œuvre à tous. Ce ni les moyens que l'utilisation d'une liste chaînée pour quelques aléatoire accède pourrait interférer avec les performances tellement.Une note finale: vous devez laisser le VM se réchauffer avant d'analyse comparative de telles choses.
OriginalL'auteur
Vous ne serait pas l'habitude d'utiliser
Double
,Integer
, etc. (De temps en tempsInteger
etc. peut être utile de stocker une 'option' valeur - vous pouvez être amené à êtrenull
parfois. C'est moins probable avecDouble
parce queNaN
est disponible pour ceux.)La raison
Double
existe est comme suit. Java dispose de deux types de valeurs: les objets (essentiellement comme le C/C++ les pointeurs sans l'arithmétique), et des valeurs primitives (par exempledouble
). Des Classes commeArrayList
peut être défini de manière à accepter toutObject
, qui permet aux utilisateurs de stockerString
,File
ou ce qu'ils veulent dans un mais des valeurs primitives commedouble
ne sont pas couvertes par cette définition. Donc les classes commeDouble
existent pour le rendre plus facile pour les classes commeArrayList
pour stockerdouble
s, sans exiger que les auteurs deArrayList
pour créer des versions spéciales pour tous les types primitifs.OriginalL'auteur
Double
est un coffretdouble
. Donc, en général, le code compilé est de vérifier laDouble
null avant de faire quelque chose avec elle. Bien sûr, cela est plus lent que de ne rien faire.Double
(et autres versions boîtes des primitives) est utile, car il est unObject
. Cela vous permet de passer à des fonctions qui prennent unObject
, et de le jeter en arrière pourDouble
quelque part d'autre. Plus utilement, il permet pour les types génériques pour le contenir: Un type générique ne peut pas contenir dedouble
ou de toute autre primitive, mais il peut contenir unDouble
.OriginalL'auteur