2009-04-08 14 views

Trả lời

16

Các thành ngữ tiêu chuẩn là:

long startTime = System.nanoTime(); 
doSomething(); 
long elapsedTime = System.nanoTime() - startTime; 
+0

có thể là ngay sau khi bạn nhận được thời gian bắt đầu, chuỗi của bạn mất quyền kiểm soát và mất một lúc để quay lại. –

+0

Bạn có mong đợi nó ghi vào đĩa khi nó bị chặn không? những gì thường quan trọng trong thời gian tường bao gồm tắc nghẽn. –

5

không dự thi, nhưng cái gì đó như:

long delta = System.nanoTime(); 
try { 
    // do your stuff 
} finally { 
    delta = System.nanoTime() - delta; 
} 
+0

Tôi mới sử dụng Java. Tại sao bạn sử dụng một khối thử kết hợp với finaly? :) –

+0

Các thử ... cuối cùng khối đảm bảo rằng đồng bằng được tính ngay cả khi một ngoại lệ được ném trong phần công việc thực tế. Điều gì có thể hoặc có thể không hữu ích cho bạn. –

+2

Tôi sẽ đề nghị bắt và xử lý ngoại lệ. Thời gian của bạn có nghĩa là không có gì nếu nó hoạt động không hoàn thành như mong đợi. – uriDium

2

Có một mẫu mã ở đây:

http://www.goldb.org/stopwatchjava.html

/* 
    Copyright (c) 2005, Corey Goldberg 

    StopWatch.java is free software; you can redistribute it and/or modify 
    it under the terms of the GNU General Public License as published by 
    the Free Software Foundation; either version 2 of the License, or 
    (at your option) any later version. 
*/ 


public class StopWatch { 

    private long startTime = 0; 
    private long stopTime = 0; 
    private boolean running = false; 


    public void start() { 
     this.startTime = System.currentTimeMillis(); 
     this.running = true; 
    } 


    public void stop() { 
     this.stopTime = System.currentTimeMillis(); 
     this.running = false; 
    } 


    //elaspsed time in milliseconds 
    public long getElapsedTime() { 
     long elapsed; 
     if (running) { 
      elapsed = (System.currentTimeMillis() - startTime); 
     } 
     else { 
      elapsed = (stopTime - startTime); 
     } 
     return elapsed; 
    } 


    //elaspsed time in seconds 
    public long getElapsedTimeSecs() { 
     long elapsed; 
     if (running) { 
      elapsed = ((System.currentTimeMillis() - startTime)/1000); 
     } 
     else { 
      elapsed = ((stopTime - startTime)/1000); 
     } 
     return elapsed; 
    } 




    //sample usage 
    public static void main(String[] args) { 
     StopWatch s = new StopWatch(); 
     s.start(); 
     //code you want to time goes here 
     s.stop(); 
     System.out.println("elapsed time in milliseconds: " + s.getElapsedTime()); 
    } 
} 
2

Các đường Tôi sẽ làm điều đó chỉ là chạy nó trong một vòng lặp một số lần. Giống như nếu bạn chạy nó 1000 lần và đồng hồ, nó sẽ cho bạn một phần nghìn giây. Chạy nó 1.000.000 lần, và nó cung cấp cho bạn micro giây.

Nếu bạn cũng muốn tìm hiểu lý do tại sao nó vẫn hoạt động, bạn có thể tạm dừng một số lần (như 10) trong khi đang chạy và điều đó sẽ cho bạn biết nó đang làm gì và tại sao.

1

Sự cố với phương thức System.xxx nhận được là chính phương thức đó cần một vài phần nghìn giây để tính toán. Cách "thực hiện" thường được chấp nhận là chạy thử nghiệm vài chục nghìn lần và tính toán mức trung bình của điều này.

Ngoài ra, tùy thuộc vào hệ điều hành của bạn, có một cái gì đó được gọi là time granularity (ví dụ cho cửa sổ). Đây là khoảng thời gian nhỏ nhất mà hệ điều hành của bạn có thể tính toán. Trên một số hệ điều hành của nó một phần nghìn giây, trên một số người khác của nó một nano giây. Nó có thể hoặc có thể không có liên quan trong trường hợp của bạn.

+0

System.nanoTime() mất 0,5 micro giây và System.currentTimeMillis() ít hơn nhiều. –

Các vấn đề liên quan