Byłem benchmarking niektórych kodu i nie mogłem go uruchomić tak szybko, jak z java.math.BigInteger
, nawet przy użyciu tego samego algorytmu. Więc kopiowane java.math.BigInteger
źródło w moim opakowaniu i próbowałem to:Czy Java JIT oszukuje, gdy działa kod JDK?
//import java.math.BigInteger;
public class MultiplyTest {
public static void main(String[] args) {
Random r = new Random(1);
long tm = 0, count = 0,result=0;
for (int i = 0; i < 400000; i++) {
int s1 = 400, s2 = 400;
BigInteger a = new BigInteger(s1 * 8, r), b = new BigInteger(s2 * 8, r);
long tm1 = System.nanoTime();
BigInteger c = a.multiply(b);
if (i > 100000) {
tm += System.nanoTime() - tm1;
count++;
}
result+=c.bitLength();
}
System.out.println((tm/count) + "nsec/mul");
System.out.println(result);
}
}
Gdy ten (JDK 1.8.0_144-B01 na MacOS) wyprowadza:
12089nsec/mul
2559044166
Kiedy uruchamiam go z linia import komentarzem:
4098nsec/mul
2559044166
to prawie trzy razy szybciej przy użyciu wersji JDK z BigInteger porównaniu mojej wersji, nawet jeśli używa dokładnie to samo kod.
Mam zbadaniu kodu bajtowego z javap, aw porównaniu wyjście kompilatora, gdy uruchomiony z opcjami:
-Xbatch -XX:-TieredCompilation -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions
-XX:+PrintInlining -XX:CICompilerCount=1
i obie wersje wydają się wygenerować ten sam kod. Czy jest więc hotspot za pomocą niektórych wstępnie obliczonych optymalizacji, których nie mogę użyć w moim kodzie? Zawsze rozumiałem, że nie. Co wyjaśnia tę różnicę?
Interesujące. 1. Czy wynik jest spójny (czy tylko losowy losowy)? 2. Czy możesz spróbować nagrzać JVM? 3. Czy można wyeliminować czynnik losowy i podać ten sam zestaw danych jako dane wejściowe dla obu testów? –
Czy próbowałeś uruchomić swój benchmark z JMH http://openjdk.java.net/projects/code-tools/jmh/? Ręczne pomiary nie są takie proste (rozgrzanie i tak dalej). –
Tak, to jest bardzo spójne. Jeśli pozwolę mu działać przez 10 minut, nadal dostanę tę samą różnicę. Ustalony losowy materiał siewny zapewnia, że obie serie otrzymują ten sam zestaw danych. –