Ero curioso di sapere quali fossero le differenze di prestazioni tra la classe Java e il tipo primitivo per il doppio. Così ho creato un piccolo benchmark e ho trovato che il tipo di classe era 3x-7x più lento del tipo primitivo. (3x sulla macchina locale OSX, 7x sulla Ideone)Java Double vs double: tipo classe vs tipo primitivo
Ecco il 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));
}
}
Allora, perché è il tipo Double in modo molto più lento? Perché è persino implementato per consentire agli operatori matematici?
È lento a causa della necessità di box e unbox. Questo è un comportamento previsto. –
@HovercraftFullOfEels Questo ha senso, ma sembra ancora un sacco di spese generali. –
È un sacco di spese generali. E per questo motivo si dovrebbe evitare l'uso di tipi di wrapper primitivi in codice time-critical. –