Câu hỏi này giống hệt với số này Two loop bodies or one (result identical) nhưng trong trường hợp của tôi, tôi sử dụng Java.Hai hoạt động trong một vòng lặp so với hai vòng lặp thực hiện cùng một hoạt động một vòng lặp
Tôi có hai vòng chạy hàng tỷ lần.
int a = 188, b = 144, aMax = 0, bMax = 0;
for (int i = 0; i < 1000000000; i++) {
int t = a^i;
if (t > aMax)
aMax = t;
}
for (int i = 0; i < 1000000000; i++) {
int t = b^i;
if (t > bMax)
bMax = t;
}
Thời gian cần để chạy hai vòng này trong máy của tôi là appr 4 giây. Khi tôi kết hợp hai vòng này thành một vòng lặp đơn và thực hiện tất cả các hoạt động trong vòng lặp đơn đó, thì nó sẽ chạy trong 2 giây. Như bạn có thể thấy các hoạt động tầm thường tạo nên nội dung vòng lặp, do đó yêu cầu thời gian không đổi.
Câu hỏi của tôi là nơi tôi nhận được cải thiện hiệu suất này?
Tôi đoán rằng nơi duy nhất có thể bị ảnh hưởng trong hai vòng riêng biệt là nó tăng i và kiểm tra nếu tôi < 1000000000 2 tỷ lần so với chỉ 1 tỷ lần nếu tôi hợp nhất các vòng với nhau. Có gì khác đang diễn ra trong đó không?
Cảm ơn!
tôi sẽ giả định đó là vì bạn đang làm hơn 1B increments, 1B so sánh hơn, và 1B nhảy hơn ... – verdesmarald
Tác động của việc di chuyển 'int t;' ra ngoài vòng lặp và chỉ thực hiện việc gán 't = a^i;' hoặc 't = b^i;' bên trong vòng lặp? – barrowc
@ barrowc nó sẽ không có tác dụng gì. Một trong những giai đoạn đầu tiên trong JIT là chuyển đổi đồ thị AST thành biểu diễn phân công duy nhất, điều này sẽ hoàn tác bí danh này vì lợi ích của phân tích tuổi thọ tốt hơn. – ddimitrov