Tôi đã làm một số thử nghiệm hiệu suất liên quan đến phân bổ đối tượng, khi tôi đi qua một kết quả lạ. Tôi có đoạn code java sau:Java: Điều gì làm tăng hiệu suất khi liên tục gọi một hàm?
public static long TestMethod(){
int len = 10000000;
Object[] obs = new Object[len];
long t = System.nanoTime();
for (int i = 0; i < len; i++) {
obs[i] = new Object();
}
return System.nanoTime() - t;
}
public static void main(String... args) throws InterruptedException {
for(int i = 0; i < 10; i++){
System.gc();
System.gc();//Wait for the gc to be finished
Thread.sleep(1000);
System.out.println(TestMethod());
}
}
vọng: cuộc gọi đầu tiên sẽ chậm hơn sau đó cuộc gọi thứ hai, do yêu cầu một không gian bộ nhớ lớn hơn từ hệ điều hành và cải tiến hotspot. Nhưng thứ hai và thứ ba sẽ gần như giống nhau.
kết quả quan sát được:
11284734000
799837000
682304000
304736000
380770000
392786000
374279000
381611000
379174000
407256000
Vẫn là một tốc độ đáng kể lên giữa phiên thứ ba và thứ tư. Điều gì gây ra sự tăng tốc này? Làm thế nào tôi có thể chắc chắn các phép đo của tôi là chính xác khi kiểm tra các chức năng khác, tôi có phải gọi hàm này nhiều hơn bốn lần trước khi đo không?
[Just-in-time delay biên dịch khởi động] (http://en.wikipedia.org/wiki/Just-in-time_compilation#Startup_delay_and_optimizations) –
Thú đọc: http://stackoverflow.com/questions/504103/how-do-i-write-a-chính xác-vi-điểm chuẩn-in-java - Đặc biệt, chạy với '-XX: + PrintCompilation -verbose: gc' VM tham số sẽ giúp bạn hiểu những gì đang xảy ra. – assylias
@assylias: Thú vị. Không biết những thông số đó. Nó có vẻ là biên dịch lại chức năng trong cuộc gọi thứ hai, và thực hiện 2 bộ sưu tập rác trong ba cuộc gọi đầu tiên, và các cuộc gọi cuối cùng không thực hiện thu gom rác trong các cuộc gọi hàm. – user23127