2011-09-19 75 views
6

Tôi muốn tính toán thời gian CPU mà hàm của tôi thực hiện trong Java. Hiện tại tôi đang làm như dưới đây.Thời gian thực hiện CPU trong Java

long startTime = System.currentTimeMillis(); 
    myfunction(); 
    long endTime = System.currentTimeMillis(); 
    long searchTime = endTime - startTime; 

Nhưng tôi phát hiện ra rằng cùng một I/P, tôi nhận được thời gian khác nhau tùy thuộc vào tải hệ thống.

Vì vậy, cách lấy thời gian CPU chính xác mà chức năng của tôi đã thực hiện.

Trả lời

6

Khi JVM làm ấm lượng thời gian thực hiện sẽ thay đổi. Lần thứ hai bạn chạy điều này sẽ luôn nhanh hơn lần đầu tiên. (Lần đầu tiên nó phải tải các lớp và gọi các khối tĩnh) Sau khi bạn đã chạy phương thức 10.000 lần nó sẽ nhanh hơn một lần nữa (Ngưỡng mặc định mà nó biên dịch mã thành mã máy gốc)

Để có được mức trung bình có thể sao lại thời gian cho một điểm chuẩn micro, tôi đề nghị bạn bỏ qua 10.000 lần lặp đầu tiên và chạy nó trong 2-10 giây sau đó.

ví dụ:

long start = 0; 
int runs = 10000; // enough to run for 2-10 seconds. 
for(int i=-10000;i<runs;i++) { 
    if(i == 0) start = System.nanoTime(); 
    // do test 
} 
long time = System.nanoTime() - start; 
System.out.printf("Each XXXXX took an average of %,d ns%n", time/runs); 

Rất quan trọng: Chỉ thực hiện một trong các vòng lặp này cho mỗi phương pháp. Điều này là bởi vì nó tối ưu hóa toàn bộ phương pháp dựa trên cách nó được sử dụng. Nếu bạn có một vòng lặp bận như thế này thì các vòng lặp sau sẽ xuất hiện chậm hơn vì chúng không chạy và sẽ được tối ưu hóa kém.

0

bạn có thể tìm kiếm câu trả lời của bạn ở đây:

How do I time a method's execution in Java?

có rất nhiều ví dụ để tính toán thời gian thực hiện phương pháp của

+0

Có nhưng không ai thực sự trả lời câu hỏi của ông về cách đo thời gian CPU của measuzre '. –

0

Có một số profilers (Jprofile, Jprobe, Yourkit) có sẵn để phân tích dữ liệu đó. Và không chỉ điều này, nhưng nhiều hơn nữa ... (chẳng hạn như sử dụng bộ nhớ, chi tiết chủ đề, vv)

21
  1. System.currentTimeMillis() sẽ chỉ bao giờ đo wall-clock time, không bao giờ thời gian CPU.
  2. Nếu bạn cần đồng hồ treo tường, sau đó System.nanoTime() thường chính xác hơn (và không bao giờ tệ hơn) currentTimeMillis().
  3. ThreadMXBean.getThreadCPUTime() có thể giúp bạn tìm hiểu thời gian CPU mà một chuỗi đã cho đã sử dụng. Sử dụng ManagementFactory.getThreadMXBean() để nhận được ThreadMXBeanThread.getId() để tìm số id của chuỗi bạn quan tâm. Lưu ý rằng phương pháp này không cần được hỗ trợ trên mọi JVM!
Các vấn đề liên quan