2015-03-19 14 views
10

Ho eseguito alcune verifiche sul fatto che x * x o Math.pow (x, 2) sia più veloce in Java. Mi aspettavo che x * x fosse un po 'più veloce, tuttavia, si è scoperto che si trattava di un equaly veloce. Qualcuno può illuminarmi, com'è possibile, per favore?x * x vs Math.pow (x, 2) prestazioni java

+4

Come fatto esattamente si prova questo? Scrivere dei micro-benchmark è molto più difficile di quanto si pensi: [Come posso scrivere un micro-benchmark corretto in Java?] (Http://stackoverflow.com/questions/504103/how-do-i-write-a-correct- micro-benchmark-in-java) – Jesper

+0

perché non provi 'x * x * x * x' vs' Math.pow (x, 4) ', potresti ottenere la risposta –

+0

L'ho provato eseguendo la stessa operazione in un ciclo e tempo di misurazione dalla funzione System.currenttimemillis() –

risposta

1

Per quello che sai è JITted (o anche già in fase di compilazione) fino alla stessa identica cosa. Questi tipi di micro-benchmark raramente danno risultati molto utilizzabili, poiché non esiste un contesto reale.

Non è sicuramente un motivo preferire uno rispetto all'altro, poiché il codice del mondo reale ha raramente una semplice operazione x^2 come hotspot delle prestazioni.

1

L'implementazione interna di Math.pow() è delegata a una funzione nativa in modo che potrebbe essere ragionevole per una buona prestazione. In ogni caso per avere risultati di test validi è necessario testare l'ora in un ciclo per avere un tempo di esecuzione realistico.

+0

Grazie per la risposta! L'ho effettivamente testato in un ciclo con miliardi di iterazioni per ottenere risultati decenti .. –

27

come è possibile, si prega di

Perché Math.pow è JVM intrinseca, cioè, JIT-compilatore inline la chiamata. Inoltre, quando vede che l'esponente è una costante 2, sostituisce la chiamata con esattamente x*x.

Proof from HotSpot sources