Tôi đã có câu hỏi rất giống nhau trong một thời gian dài. Vì vậy, tôi đã thử nghiệm một đoạn mã thậm chí đơn giản hơn.
Kết luận: Đối với những trường hợp như vậy , KHÔNG có sự khác biệt về hiệu suất.
Trường hợp vòng lặp bên ngoài
int intermediateResult;
for(int i=0; i < 1000; i++){
intermediateResult = i+2;
System.out.println(intermediateResult);
}
Trường hợp vòng lặp bên trong
for(int i=0; i < 1000; i++){
int intermediateResult = i+2;
System.out.println(intermediateResult);
}
Tôi đã kiểm tra tệp đã biên dịch trên trình dịch ngược của IntelliJ và trong cả hai trường hợp, tôi đều nhận được cùng một Test.class
for(int i = 0; i < 1000; ++i) {
int intermediateResult = i + 2;
System.out.println(intermediateResult);
}
Tôi cũng đã phân tách mã cho cả hai trường hợp bằng cách sử dụng phương thức được đưa ra trong câu trả lời này . Tôi sẽ chỉ hiển thị những phần có liên quan đến câu trả lời
Trường hợp vòng lặp bên ngoài
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;
Trường hợp vòng lặp bên trong
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;
Nếu bạn chú ý kỹ, chỉ có phần Slot
được gán i
và intermediateResult
in LocalVariableTable
được hoán đổi như một sản phẩm theo thứ tự xuất hiện của chúng. Sự khác biệt tương tự về vị trí được phản ánh trong các dòng mã khác.
- Không có hoạt động bổ sung đang được thực hiện
intermediateResult
vẫn là một biến cục bộ trong cả hai trường hợp, vì vậy không có thời gian truy cập khác nhau.
TẶNG KEM
Trình biên dịch thực hiện rất nhiều tối ưu hóa, hãy xem những gì xảy ra trong trường hợp này.
Không có trường hợp làm việc
for(int i=0; i < 1000; i++){
int intermediateResult = i;
System.out.println(intermediateResult);
}
Không có công việc dịch ngược
for(int i = 0; i < 1000; ++i) {
System.out.println(i);
}