2009-07-02 51 views
16

System.currentTimeMillis() là thước đo hiệu suất thời gian tốt nhất trong Java? Có bất kỳ dấu hiệu của gotcha khi sử dụng điều này để so sánh thời gian trước khi hành động được đưa đến thời gian sau khi hành động được thực hiện? Có một lựa chọn tốt hơn?System.currentTimeMillis() là thước đo hiệu suất thời gian tốt nhất trong Java?

+0

câu trả lời hay ở đây http://stackoverflow.com/a/9458267/741970 –

Trả lời

12

Tôi hy vọng không - đó là những gì tôi sử dụng khi tôi không sử dụng nanoTime().

+9

Một lưu ý (trên Windows w. Sun JDK6, trong bất kỳ trường hợp nào) với 'nanoTime' là giá trị trả lại phụ thuộc vào lõi CPU thực thi chủ đề. Nếu chủ đề bắt đầu thực hiện trên một lõi và kết thúc trên một lõi khác, các số của bạn sẽ được phần nào tắt. Tôi đã có mã như 'long start = System.nanoTime(); làm đi(); long elapsedNanos = System.nanoTime() - bắt đầu; 'và kết hợp với' elapsedNanos' là số âm. – gustafc

+0

nếu giữa thời gian bắt đầu và kết thúc Chủ đề bị treo thì thời gian kết thúc cũng sẽ phản ánh thời gian tạm ngưng. do đó, sự kết thúc sẽ không phải là thời gian thực tế mà Thread đã bỏ ra để thực hiện. –

0

Trước Java 1.5 chỉ có System.currentTimeMillis. Tuy nhiên mức độ chi tiết của giá trị phụ thuộc vào hệ điều hành cơ bản và có thể lớn. Trên Windows XP, đôi khi tôi kết thúc với khoảng cách 20ms. Tôi nghe nói Linux là cách tốt hơn với những khoảng trống trong khoảng 1-2ms.

Với Java 1.5, bạn cũng có thể sử dụng System.nanoTime. Tôi chưa bao giờ gặp vấn đề với cái này.

-1

Một Gotcha là điều này đo thời gian thực trôi qua, không phải thời gian CPU - vì vậy nó là rất phụ thuộc vào tải hệ thống. Điều này là tốt nếu bạn trên một máy khác miễn phí, nhưng đôi khi có thể tạo ra kết quả thú vị nếu các quá trình khác đang cố gắng để làm việc.

This article có giải pháp xen kẽ cho sự cố.

+1

Liên kết ngừng hoạt động:/ –

+0

Bị bỏ qua vì liên kết được tham chiếu không còn khả dụng nữa. Vui lòng trích dẫn thông tin có liên quan. – ooxi

2

ngoài System.nanoTime(), JMX có lẽ là lựa chọn khả thi nhất:

java.lang.management.ManagementFactory.getThreadMXBean() 

bạn có thể truy vấn thời gian phân luồng CPU hiện nay (đo bằng nano giây nhưng không phải với nano giây chính xác, như đối với System.nanoTime())

1

Nếu bạn cần các phép đo thời gian đơn điệu, System.nanoTime là một lựa chọn tốt hơn. System.currentTimeMillis chịu sự thay đổi về thời gian UTC - giây nhảy vọt, cập nhật NTP và jitter, cũng như người dùng thiết lập đồng hồ hệ thống *. Điều này có thể gây ra một số thất bại ngoạn mục trong một số loại ứng dụng định thời gian nhất định. System.nanoTime được cho là miễn dịch với tất cả điều đó.

Sự cố với System.nanoTime bao gồm tràn số định kỳ và không chính xác về thời gian dài, làm cho System.currentTimeMillis tốt hơn trong thời gian dài hơn (miễn là người dùng chỉ để đồng hồ hệ thống). Lưu ý rằng thay đổi múi giờ và múi giờ ban ngày không ảnh hưởng đến System.currentTimeMillis.

* Windows "Đồng bộ hóa với thời gian internet" thực hiện thay đổi từng bước. Điều này có thể rất gây rối, trái ngược với một thực thi NTP client thích hợp mà "đuổi" máy chủ bằng cách điều chỉnh tần số timebase của máy khách.

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