Bản thân tôi và một nhà phát triển khác trên thời gian của tôi gần đây đã chuyển từ máy tính Core 2 Duo sang Core 2 Quad 9505 mới; cả hai đều chạy Windows XP SP3 32 bit với JDK 1.6.0_18.Tại sao System.nanoTime() của tôi bị hỏng?
Khi làm như vậy, một vài thử nghiệm đơn vị tự động của chúng tôi cho một số mã thời gian/thống kê/số liệu tổng hợp bắt đầu thất bại, do những giá trị vô lý trở lại từ System.nanoTime().
mã kiểm tra cho thấy hành vi này, đáng tin cậy, trên máy tính của tôi là:
import static org.junit.Assert.assertThat;
import org.hamcrest.Matchers;
import org.junit.Test;
public class NanoTest {
@Test
public void testNanoTime() throws InterruptedException {
final long sleepMillis = 5000;
long nanosBefore = System.nanoTime();
long millisBefore = System.currentTimeMillis();
Thread.sleep(sleepMillis);
long nanosTaken = System.nanoTime() - nanosBefore;
long millisTaken = System.currentTimeMillis() - millisBefore;
System.out.println("nanosTaken="+nanosTaken);
System.out.println("millisTaken="+millisTaken);
// Check it slept within 10% of requested time
assertThat((double)millisTaken, Matchers.closeTo(sleepMillis, sleepMillis * 0.1));
assertThat((double)nanosTaken, Matchers.closeTo(sleepMillis * 1000000, sleepMillis * 1000000 * 0.1));
}
}
sản lượng tiêu biểu:
millisTaken=5001
nanosTaken=2243785148
Chạy nó sản lượng 100x kết quả nano giữa 33% và 60% so với thực tế giờ ngủ; thường là khoảng 40%.
Tôi hiểu điểm yếu về độ chính xác của bộ tính giờ trong Windows và đã đọc các chủ đề có liên quan như Is System.nanoTime() consistent across threads?, tuy nhiên, hiểu biết của tôi là System.nanoTime() nhằm mục đích chính xác mục đích chúng tôi đang sử dụng: - đo thời gian trôi qua; chính xác hơn currentTimeMillis().
Có ai biết tại sao nó trả về kết quả điên rồ như vậy không? Đây có phải là một vấn đề kiến trúc phần cứng (điều duy nhất đã thay đổi là CPU/Bo mạch chủ trên máy này)? Một vấn đề với Windows HAL với phần cứng hiện tại của tôi? Một vấn đề JDK? Tôi có nên từ bỏ nanoTime() không? Tôi có nên đăng nhập một lỗi ở đâu đó hoặc bất kỳ đề xuất nào về cách tôi có thể điều tra thêm không?
CẬP NHẬT 19/07 03:15 UTC: Sau khi thử trường hợp thử nghiệm của finnw bên dưới, tôi đã thực hiện một số Googling khác, đi qua các mục như bugid:6440250. Nó cũng nhắc nhở tôi về một số hành vi kỳ lạ khác mà tôi nhận thấy vào cuối ngày thứ Sáu, nơi ping đã trở lại tiêu cực. Vì vậy, tôi đã thêm /usepmtimer vào boot.ini của tôi và bây giờ tất cả các thử nghiệm hoạt động như mong đợi., Và ping của tôi cũng bình thường.
Tôi hơi bối rối vì sao đây vẫn là vấn đề; từ đọc sách của tôi, tôi nghĩ rằng TSC vs PMT vấn đề đã được giải quyết phần lớn trong Windows XP SP3. Có thể vì máy của tôi ban đầu là SP2 và được vá thành SP3 thay vì được cài đặt ban đầu là SP3? Tôi bây giờ cũng tự hỏi liệu tôi có nên cài đặt các bản vá lỗi như một cái ở số MS KB896256 hay không. Có lẽ tôi nên thực hiện điều này với nhóm xây dựng máy tính để bàn của công ty?
Bạn có nhận được một máy hoàn toàn mới hoặc máy hiện tại của bạn đã được nâng cấp có giữ cài đặt Windows cũ không? –
Máy hoàn toàn mới; xây dựng lại trên một tiêu chuẩn công ty xây dựng. – Chad
hoạt động tốt cho tôi trong Windows 7 64 bit mới nhất JDK 6. – TofuBeer