দীর্ঘদিন ধরে আমার এই একই প্রশ্ন ছিল। সুতরাং আমি একটি এমনকি সহজ টুকরা কোড পরীক্ষা।
উপসংহার: জন্য এই ক্ষেত্রে আছে কোন কর্মক্ষমতা পার্থক্য।
বাইরে লুপ কেস
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
ভিতরে লুপ কেস
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
আমি ইন্টেলিজের ডিকম্পিলারটিতে সংকলিত ফাইলটি পরীক্ষা করেছিলাম এবং উভয় ক্ষেত্রেই আমি একই পেয়েছি Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
আমি এই উত্তরে প্রদত্ত পদ্ধতিটি ব্যবহার করে উভয়ের ক্ষেত্রে কোড বিযুক্ত করেছি । আমি উত্তরের সাথে কেবল প্রাসঙ্গিক অংশগুলি দেখাব
বাইরে লুপ কেস
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_2
2: iload_2
3: sipush 1000
6: if_icmpge 26
9: iload_2
10: iconst_2
11: iadd
12: istore_1
13: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iload_1
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: iinc 2, 1
23: goto 2
26: return
LocalVariableTable:
Start Length Slot Name Signature
13 13 1 intermediateResult I
2 24 2 i I
0 27 0 args [Ljava/lang/String;
ভিতরে লুপ কেস
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: sipush 1000
6: if_icmpge 26
9: iload_1
10: iconst_2
11: iadd
12: istore_2
13: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
16: iload_2
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: iinc 1, 1
23: goto 2
26: return
LocalVariableTable:
Start Length Slot Name Signature
13 7 2 intermediateResult I
2 24 1 i I
0 27 0 args [Ljava/lang/String;
আপনি যদি মনোযোগ দিয়ে মনোযোগ দেন, কেবলমাত্র Slot
নিযুক্ত করা i
এবং intermediateResult
ইন LocalVariableTable
তাদের উপস্থিতি ক্রমের একটি পণ্য হিসাবে অদলবদল করা হবে। স্লটে একই পার্থক্য কোডের অন্যান্য লাইনে প্রতিফলিত হয়।
- কোনও অতিরিক্ত অপারেশন করা হচ্ছে না
intermediateResult
উভয় ক্ষেত্রে এখনও স্থানীয় পরিবর্তনশীল, তাই কোনও পার্থক্য অ্যাক্সেসের সময় নেই।
বোনাস
সংকলকগণ এক টন অপ্টিমাইজেশন করেন, এই ক্ষেত্রে কী ঘটে তা একবার দেখুন।
জিরো কাজের ক্ষেত্রে
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
জিরোর কাজ পচে গেছে
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}