Overhead enorme di aggiunta lunga rispetto alla chiamata nativa?

0

A eseguire un semplice test JDK 1.7.0_45 (Windows 7, 64 bit):

Test 1:

long start = System.nanoTime();
for (int i=0; i < 1000000; i++) {
    System.currentTimeMillis();
}

elapsed = System.nanoTime() - start;

Versus Test 2:

long start = System.nanoTime();
long adjust = 313231;
for (int i=0; i < 1000000; i++) {
    long result = System.currentTimeMillis() + adjust;
}

elapsed = System.nanoTime() - start;

Sul mio sistema, il primo test era di circa 28 nano / chiamata. Il secondo a circa 1250 nano / chiamata. Questo è un enorme overhead 44x. Qualcuno può spiegare una differenza così grande?

    
posta user3628829 16.07.2014 - 12:33
fonte

1 risposta

3

Guarda il codice byte generato. Una spiegazione ovvia potrebbe essere che la prima chiamata a currentTimeMillis() sia così ovvia che l'ottimizzatore lo ha rimosso del tutto e il secondo no. Ci sono innumerevoli ragioni simili e meno simili possibili, e speculare su di loro senza guardare a quello che sta realmente accadendo è piuttosto inutile.

    
risposta data 16.07.2014 - 12:39
fonte

Leggi altre domande sui tag