मैं कुछ कोड बेंच रहा था, और मैं इसे java.math.BigInteger
ठीक उसी एल्गोरिथ्म का उपयोग करते हुए भी उतनी तेजी से चलाने के लिए नहीं मिला । इसलिए मैंने java.math.BigInteger
स्रोत को अपने पैकेज में कॉपी किया और यह कोशिश की:
//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);
}
}
जब मैंने इसे (jdk 1.8.0_144-b01 को MacOS पर चलाया) तो यह आउटपुट:
12089nsec/mul
2559044166
जब मैं इसे आयात लाइन के साथ चलाता हूँ
4098nsec/mul
2559044166
BigInteger बनाम मेरे संस्करण के JDK संस्करण का उपयोग करते समय यह लगभग तीन गुना तेज़ है, भले ही यह ठीक उसी कोड का उपयोग कर रहा हो।
मैंने javap के साथ bytecode की जांच की है, और विकल्प के साथ चलने पर कंपाइलर आउटपुट की तुलना की है:
-Xbatch -XX:-TieredCompilation -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions
-XX:+PrintInlining -XX:CICompilerCount=1
और दोनों संस्करण एक ही कोड उत्पन्न करते हैं। तो हॉटस्पॉट कुछ प्रीक्म्प्यूटेड ऑप्टिमाइज़ेशन का उपयोग कर रहा है जो मैं अपने कोड में उपयोग नहीं कर सकता हूं? मुझे हमेशा समझ में आया कि वे नहीं करते। इस अंतर को क्या समझाता है?