方法System.currentTimeMillis()真的返回当前时间吗?

6

基于链接中提出的思路,我实现了几种不同的“睡眠方法”。其中之一是“二进制睡眠”,它的代码如下:

while (System.currentTimeMillis() < nextTimeStamp)
{
sleepTime -= (sleepTime / 2);
sleep(sleepTime);
}

由於檢查下一時間步是否已到達是在開頭進行的,所以我會預期該方法運行時間過長。但模擬誤差(預期時間 - 實際時間)的累積分布看起來像這樣:alt text http://img267.imageshack.us/img267/4224/errorvscummulativearran.jpg 有人有什麼想法為什麼會得出這樣的結果嗎?也許System.currentTimeMillis()方法不真正返回當前時間?
祝好,
馬克思
@irreputable 當我進行評估時,我還使用了一個德國統計程序創建了一個鐘形曲線。因為無法更改標題,這裡是所有相關項目的英文翻譯:
Häufigkeit = frequency
Fehler = error Mittelwert = average Std-Abw = standard deviation alt text http://img694.imageshack.us/img694/2254/bellcurve.jpg

1
我尝试在http://stackoverflow.com/questions/ask上提出一个问题,我复制并粘贴了您的主题标题到我的新测试问题中,在输入消息字段时,我得到了一个列出所有(非常)相关的主题列表,这些主题已经回答了您的问题。我想知道您是否注意到并探索过这一点? - BalusC
哦,你说得对。也许在提问之前我应该更经常地查看相关主题 :-) - Markus
+1 对于曲线。我们知道它不是很精确,但看到一些量化数据还是挺好的。你能把它做成钟形曲线吗? - irreputable
3个回答

10

2
nanoTime()具有更好的精确性,但其准确度与currentTimeMillis()相同(取决于底层操作系统)。请参阅http://en.wikipedia.org/wiki/Accuracy_and_precision。 - Steve Kuo
谢谢提醒(英语不是我的母语)。我已经修复了。 - BalusC
1
然而..你的英语也不是很好。应该是 "its" (它的)而不是 "it's"(它是) :o) - BalusC

2
根据文档,
 * Returns the current time in milliseconds.  Note that
 * while the unit of time of the return value is a millisecond,
 * the granularity of the value depends on the underlying
 * operating system and may be larger.  For example, many
 * operating systems measure time in units of tens of
 * milliseconds.

2
您所看到的是底层时钟分辨率达到15ms。这是操作系统和中断速率的特性。对于Linux内核,有一个补丁可以将此分辨率提高到1毫秒,不确定Windows是否有相应的补丁。已经有一些关于此问题的文章posts

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接