2015-07-01 10 views
7

Sul mio Raspberry ho fatto alcuni test sulle prestazioni come CaffeineMark e SciMark con entrambe le JVM. C'è un'enorme differenza di prestazioni tra di loro anche se ho sentito che le differenze sono molto piccole. Ho anche provato a calcolare con numeri mobili e Oracle JDK ha ottenuto un punteggio migliore anche se entrambi dovrebbero supportare l'hard float abi.Perché c'è una differenza di prestazioni su Raspberry pi tra Open e Oracle JDK?

Io uso Linux raspberrypi 3.18.11-v7+ come sistema operativo.

OpenJDK:  
java version "1.7.0_79" 
OpenJDK Runtime Environment (IcedTea 2.5.5) (7u79-2.5.5-1~deb7u1+rpi1) 
OpenJDK Zero VM (build 24.79-b02, mixed mode) 

OracleJDK: 
java version "1.7.0_40" 
Java(TM) SE Runtime Environment (build 1.7.0_40-b43) 
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode) 

SciMark results: 

       OpenJDK   OracleJDK 
Composite Score 14.280735577363213 || 32.24948180361924 
FFT (1024)  9.482866845055302 || 26.447121360843663 
SOR (100x100) 27.14938943220646 || 59.68022533004399 
Monte Carlo  3.6298604956147384 || 10.561671865446971 
Sparse matmult 15.603809523809524 || 26.64931580928407 
LU (100x100) 15.53775159013005 || 37.90907465247749 

ho usato un programma che conta un galleggiante ad intervalli di 0,1 a 600000 Ho cercato di verificare le prestazioni di JVM da manipolazione galleggianti.

OpenJDK: 257ms
OracleJDK: 151ms

0.1 gradini 1200000:

OpenJDK: 457ms
OracleJDK: 263ms

public class Testing { 

    /** 
    * @param args 
    */ 
    public static long Test() 
    { 
     float counter=0.0f; 
     long startTime = System.currentTimeMillis(); 
     while (counter <= 1_200_000.0f) 
     { 
      counter += 0.1f; 
     } 
     return System.currentTimeMillis() - startTime; 
    } 

    public static void main(String[] args){ 
     System.out.println(Test()); 
    } 

} 

Ho provato i miglioramenti citati da SlipperySeal e mettere il prova nel ciclo. Ho anche provato ad usare il compilatore c2 ma i risultati non erano diversi.

+1

Si prega di quantificare. Pubblica alcuni numeri prestazionali misurati. –

+0

Inoltre, si prega di inserire le versioni che si stanno utilizzando di entrambi jdk –

+1

https://blogs.oracle.com/jtc/entry/comparing_jvms_on_arm_linux questo ha alcuni anni ma sembra che Oracle abbia appena creato un JIT migliore.Inoltre, potresti voler inserire l'intero test in un ciclo, perché le JIT non sempre danno il via immediatamente. Possono essere eseguiti in modalità interpretata fino a quando si verifica un certo numero di cicli prima di diventare candidati per JIT. – slipperyseal

risposta

13

OpenJDK Zero VM è un interprete solo JVM. Da un lato, è più facile portarlo perché non ha un codice assembly specifico per l'architettura ma, d'altro canto, non è performante perché non ha un codice assembly specifico per l'architettura.

OracleJDK sfrutta l'ABI a virgola mobile della piattaforma (Soft Float su RP1 e Hard Float su RP2). Posso immaginare che abbia un bel numero di codice assembly, specifico per l'architettura ARM, ed è per questo che segna meglio.

Un compilatore JIT denominato Shark, basato su LLVM, è stato introdotto in OpenJDK Zero VM nella fase iniziale. Non sono sicuro che il tuo sistema OpenJDK sia stato creato con Shark, ma probabilmente lo è stato. Fornisce un compromesso tra non avere codice assembly e comunque eseguire codice nativo efficiente. Se Shark non è abilitato, la creazione di IcedTea con Shark abilitato migliorerà le prestazioni. Se Shark è abilitato, questo è il motivo per cui OpenJDK non succhia tanto.

1

Solo un aggiornamento per novembre 2017.

ho eseguito un punto di riferimento off-line Java Whetstone il Raspberry Pi 3 con Raspbian Stretch. Il codice sorgente può essere trovato here nel file Raspberry_Pi_Benchmarks/java/source code/whetstone-off-line/whetstc.java.

La conclusione è che openjdk versione 1.8.0_151 è molto più veloce di Oracle JDK versione 1.8.0_65 su Raspberry Pi 3.

oracolo-java8-jdk da repos Raspbian:

$ java -version 
java version "1.8.0_65" 
Java(TM) SE Runtime Environment (build 1.8.0_65-b17) 
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)` 

$ java whetstc 
    Whetstone Benchmark Java Version, Nov 15 2017, 11:16:37 

                1 Pass 
Test     Result  MFLOPS  MOPS millisecs 

N1 floating point -1.124750137  91.52    0.2098 
N2 floating point -1.131330490  89.01    1.5100 
N3 if then else  1.000000000    44.27 2.3380 
N4 fixed point  12.000000000    229.76 1.3710 
N5 sin,cos etc.  0.499110103    3.01 27.6400 
N6 floating point 0.999999821  44.95   12.0000 
N7 assignments  3.000000000    137.09 1.3480 
N8 exp,sqrt etc. 0.751108646    0.58 63.9100 

MWIPS        90.64   110.3268 

Operating System Linux, Arch. arm, Version 4.9.35-v7+ 
Java Vendor   Oracle Corporation, Version 1.8.0_65 
CPU null 

openjdk-8-jdk da pronti contro termine Raspbian:

$ java -version 
openjdk version "1.8.0_151" 
OpenJDK Runtime Environment (build 1.8.0_151-8u151-b12-1~deb9u1-b12) 
OpenJDK Client VM (build 25.151-b12, mixed mode) 

$ java whetstc 
    Whetstone Benchmark Java Version, Nov 15 2017, 10:59:14 

                1 Pass 
Test     Result  MFLOPS  MOPS millisecs 

N1 floating point -1.124750137 183.03    0.1049 
N2 floating point -1.131330490 176.24    0.7626 
N3 if then else  1.000000000    88.77 1.1660 
N4 fixed point  12.000000000    390.43 0.8068 
N5 sin,cos etc.  0.499110132    9.27 8.9740 
N6 floating point 0.999999821  75.89    7.1080 
N7 assignments  3.000000000    274.18 0.6740 
N8 exp,sqrt etc. 0.825148463    7.09 5.2480 

MWIPS        402.51   24.8443 

Operating System Linux, Arch. arm, Version 4.9.59-v7+ 
Java Vendor   Oracle Corporation, Version 1.8.0_151 
CPU null