2015-07-01 30 views
7

Na mojej malinowej zrobiłem kilka testów wydajności, takich jak CaffeineMark i SciMark z oboma JVM. Istnieje ogromna różnica w wydajności między nimi, chociaż słyszałem, że różnice są bardzo małe. Próbowałem także obliczać liczbami zmiennoprzecinkowymi, a Oracle JDK uzyskał lepszy wynik, mimo że oba powinny obsługiwać dysk twardy abi.Dlaczego istnieje taka różnica w wydajności Raspberry pi między Open a Oracle JDK?

Używam jako systemu operacyjnego Linux raspberrypi 3.18.11-v7+.

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 

użyłem programu, który zlicza pływaka w 0,1 kroków 600000 próbowałem do testowania wydajności JVM na obsługę pływaków.

OpenJDK: 257ms
OracleJDK: 151ms

0,1 kroki 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()); 
    } 

} 

że próbował ulepszenia wymienione z SlipperySeal i umieścić przetestuj w pętli. Próbowałem również użyć kompilatora c2, ale wyniki nie były różne.

+1

Proszę oszacowania. Opublikuj niektóre zmierzone liczby wyników. –

+0

Proszę również umieścić wersje, których używasz zarówno jdk –

+1

https://blogs.oracle.com/jtc/entry/comparing_jvms_on_arm_linux to kilka lat, ale wygląda na to, że Oracle właśnie ulepszyło JIT.Możesz również umieścić cały test w pętli, ponieważ JIT nie zawsze zaczynają od razu. Mogą być uruchamiani w trybie interpretacji, dopóki pewna liczba pętli nie wystąpi, zanim zostaną kandydatami do JITing. – slipperyseal

Odpowiedz

13

OpenJDK Zero VM to interpreter tylko JVM. Z jednej strony łatwiej jest portować, ponieważ nie ma on specyficznego dla architektury kodu zespołu, ale z drugiej strony nie jest wydajny, ponieważ nie ma specyficznego dla architektury kodu zespołu.

OracleJDK wykorzystuje zmiennoprzecinkowy punkt platformy ABI (Soft Float na RP1 i Hard Float na RP2). Mogę sobie wyobrazić, że ma sporo kodu montażowego, specyficznego dla architektury ARM, i dlatego osiąga lepsze wyniki.

Kompilator JIT o nazwie Shark, oparty na LLVM, został wprowadzony we wczesnej wersji OpenJDK Zero VM. Nie jestem pewien, czy OpenJDK twojego systemu został zbudowany z Shark, ale prawdopodobnie tak było. Zapewnia kompromis między brakiem kodu a uruchomieniem wydajnego natywnego kodu. Jeśli Shark nie jest włączony, budowanie IcedTea z włączoną Shark poprawi wydajność. Jeśli Shark jest włączony, jest to powód, dla którego OpenJDK nie jest aż tak obfity.

1

właśnie aktualizacja do listopada 2017 r

uruchomić Java Whetstone odniesienia off-line na Raspberry Pi 3 z Raspbian Stretch. Kod źródłowy można znaleźć here w pliku Raspberry_Pi_Benchmarks/java/source code/whetstone-off-line/whetstc.java.

Wniosek jest taki, że openjdk wersja 1.8.0_151 jest znacznie szybsze niż Oracle JDK wersji 1.8.0_65 na Raspberry Pi 3.

Oracle java8-jdk z Raspbian repo:

$ 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 z Raspbian repo:

$ 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