2017-03-17 28 views
2

我們有一個JavaScript函數,得到兩個事件的開始和結束時間:如何在JavaScript中以兩種方式比較NTP時間更新後的狀態?

var startTime = new Date().getTime(); 
// A long running task occurs 
var endTime = new Date().getTime(); 

我們已經發現的問題在於,getTime()似乎是依賴於系統時鐘。不幸的是,我們遇到了一些情況,用戶的時鐘在這兩個調用之間發生了變化,顯然是通過Windows NTP時間更新(例如,Windows出時間服務器以獲得準確的時間,然後將系統時鐘更改爲正確的時間)。因此,我們繞了這樣的事情:

startTime = 12:00:00 
// 30 second task is kicked off 
// NTP time update detects that the system is one minute ahead and corrects the clock 
endTime = 11:59:30 // It ended before it began 

有什麼辦法,我可以在這樣將生存NTP時間更新辦法比較兩個時間?我們的JavaScript應用程序無法查詢公司防火牆之外的任何服務器,因此自己調用NTP服務器是不可能的。

+2

這不是一般的性能測量問題重複,因爲不是所有的用於測量時間的性能技術(=答案就這些問題)是不可知的NTP更新! 但是,http://stackoverflow.com/questions/313893/how-to-measure-time-taken-by-a-function-to-execute上的最高評分答案仍然是要走的路,因爲「[。 ..]與Date.now()不同,Performance.now()返回的值總是以恆定的速率增加,與系統時鐘無關(可能會手動調整或通過NTP等軟件扭曲)。 –

回答

0

就像清潔工:我不會做窗戶。 所以我的知識是多年來unix(類似)機器上的各種ntp守護進程。

不應該將ntpd作爲執行某個步驟的一般方法,而是應該加快速度並減慢系統時鐘。如果它需要做一步,你的機器要麼開始走出去,要麼有一個鐘錶(或者只是蹩腳的硬件 - 它們也存在)。

這意味着普通條件下,NTPD將確保該時間表是有效和持續而沒有不連續(這可能是一個有點快或慢了一點,雖然)。只有當系統時間和UTC的差異太大以至於考慮「步驟」時,這些可能確實會導致時間倒退,但通常情況下,如果它們發生,它們可以被記錄。

系統時間的步驟也可能導致各種其他問題:例如,使得可能會感到困惑。

現代ntpd有配置執行步驟時的閾值的選項。

解決方案:

你可以揣摩出你的機器登錄,他們執行NTP一步,並作出反應的是(不是一件容易的事做這個跨平臺)。

使用除系統時間以外的其他一些時間度量。

如果你想避免這一切,你最好打賭:自己查詢公共NTP服務器,而不是依賴系統時間,如果這是重要的。

正如你所說你不能這樣做:通過http(s)查詢具有可靠時鐘的服務器的時間。要獲得NTP的準確性並不容易,但是如果您要測量的數量級爲30秒,則使用http(s)引入的差異可能會很小。

如果您確實需要這樣的準確性:通過HTTP傳輸NTP到網絡服務器,並讓NTP處理傳輸延遲。一點點工作,但如果你絕望......

如果你在你自己的企業環境中運行這個,你可以很容易地設置你自己的ntp服務器。您還可以購買現成的時間服務器(只是爲了讓您開始:谷歌「Meinberg」,但也有其他人也可以),甚至可以用ntp廣播本地網絡的時間。

現在說:我對需要有點奇怪的感覺來測量應用程序中的流逝時間。

背景信息: http://doc.ntp.org/current-stable/ntpd.html