ইতিমধ্যে ইঙ্গিত হিসাবে, জেআইটি (কেবলমাত্র সময়) সংকলক অপ্রয়োজনীয় পুনরাবৃত্তি অপসারণ করতে একটি খালি লুপ অনুকূল করতে পারেন। কিন্তু কিভাবে?
আসলে, দুটি জেআইটি সংকলক রয়েছে: সি 1 এবং সি 2 । প্রথমে কোডটি C1 দিয়ে সংকলিত হয়েছে। সি 1 পরিসংখ্যান সংগ্রহ করে এবং জেভিএমকে এটি আবিষ্কার করতে সহায়তা করে যে 100% ক্ষেত্রে আমাদের খালি লুপটি কোনও পরিবর্তন করে না এবং অকেজো হয়। এই পরিস্থিতিতে সি 2 মঞ্চে প্রবেশ করে। কোডটি যখন প্রায়শই কল করা হয়, তখন এটি সংগৃহীত পরিসংখ্যান ব্যবহার করে সি 2 দিয়ে অনুকূলিত এবং সংকলন করা যায়।
উদাহরণ হিসাবে, আমি পরবর্তী কোড স্নিপেট পরীক্ষা করব (আমার জেডি কে 9-অভ্যন্তরীণ বিল্ডিং স্লোডব্যাগে সেট করা আছে ):
public class Demo {
private static void run() {
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
}
System.out.println("Done!");
}
}
নিম্নলিখিত কমান্ড লাইনের বিকল্পগুলির সাথে:
-XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*Demo.run
এবং আমার রান পদ্ধতির বিভিন্ন সংস্করণ রয়েছে , সি 1 এবং সি 2 যথাযথভাবে সংকলিত। আমার জন্য, চূড়ান্ত রূপটি (সি 2) এর মতো দেখাচ্ছে:
...
; B1: # B3 B2 <- BLOCK HEAD IS JUNK Freq: 1
0x00000000125461b0: mov dword ptr [rsp+0ffffffffffff7000h], eax
0x00000000125461b7: push rbp
0x00000000125461b8: sub rsp, 40h
0x00000000125461bc: mov ebp, dword ptr [rdx]
0x00000000125461be: mov rcx, rdx
0x00000000125461c1: mov r10, 57fbc220h
0x00000000125461cb: call indirect r10 ; *iload_1
0x00000000125461ce: cmp ebp, 7fffffffh ; 7fffffff => 2147483647
0x00000000125461d4: jnl 125461dbh ; jump if not less
; B2: # B3 <- B1 Freq: 0.999999
0x00000000125461d6: mov ebp, 7fffffffh ; *if_icmpge
; B3: # N44 <- B1 B2 Freq: 1
0x00000000125461db: mov edx, 0ffffff5dh
0x0000000012837d60: nop
0x0000000012837d61: nop
0x0000000012837d62: nop
0x0000000012837d63: call 0ae86fa0h
...
এটি কিছুটা অগোছালো তবে আপনি যদি ঘনিষ্ঠভাবে তাকান তবে আপনি খেয়াল করতে পারেন যে এখানে কোনও দীর্ঘ চলমান লুপ নেই। এখানে 3 টি ব্লক রয়েছে: বি 1, বি 2 এবং বি 3 এবং কার্যকরকরণের পদক্ষেপগুলি হতে পারে B1 -> B2 -> B3
বা B1 -> B3
। যেখানে Freq: 1
- একটি ব্লক কার্যকর করার আনুমানিক ফ্রিকোয়েন্সি।
javap -v
দেখতে বাইট-কোড পরীক্ষা করুন ।