আমি কিছু কোড বেঞ্চমার্কিং করছিলাম, এবং 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);
}
}
আমি যখন এটি চালনা করি (ম্যাকোজে 1.8.0_144-b01 jdk) এটি আউটপুট দেয়:
12089nsec/mul
2559044166
আমি যখন এটিকে আমদানি লাইনটি নিরবিচ্ছিন্নভাবে চালিত করি তখন:
4098nsec/mul
2559044166
আমার সংস্করণ বনাম বিগইন্টেজারের জেডিকে সংস্করণ ব্যবহার করার সময় এটি প্রায় তিনগুণ দ্রুত, যদিও এটি সঠিক কোডটি ব্যবহার করে।
আমি জাভাপের সাথে বাইটকোড পরীক্ষা করেছি এবং অপশনগুলির সাথে চলাকালীন কম্পাইলার আউটপুট তুলনা করেছি:
-Xbatch -XX:-TieredCompilation -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions
-XX:+PrintInlining -XX:CICompilerCount=1
এবং উভয় সংস্করণ একই কোড উত্পন্ন বলে মনে হচ্ছে। তাহলে হটস্পট কি এমন কিছু প্রাক্পম্পিউটিড অপটিমাইজেশন ব্যবহার করছে যা আমি আমার কোডটিতে ব্যবহার করতে পারি না? আমি সবসময় বুঝতে পারি যে তারা তা করে না। এই পার্থক্য কী ব্যাখ্যা করে?