[英]Is 1ms Java timer delay too quick?
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 1); // 1 = 1ms delay between each iteration
每次觸發它都會運行一個超快速的操作,它基本上不需要時間:基本上它需要當前毫秒經過的值,並在以毫秒為關鍵的Map中快速查找時遞增它。
你認為1ms的延遲會太快嗎? 這是否會使系統陷入困境? 嘗試使用這款超級快速計時器有危險嗎?
也許。 在當代計算機上,很多事情都可以在一毫秒內完成,因此它取決於很多事情。 您可能應該找出可接受的最慢速率,然后選擇1和該數字之間的合理值。 這將每天執行更多約86,400,000次。 這對你想要完成的事情有意義嗎?
編輯:作為對問題說明的一些評論,如果您假設計時器將始終以您提供的速率執行,則此方法可能存在根本缺陷。 無論速率如何,你都無法做出這種假設。 這很難分辨,因為細節很少,但我覺得你應該考慮使用隊列而不是Map。
這取決於 。
問自己這些問題:
一個ms可能很長(高端游戲PC)或非常非常短(老一代智能手機),並且根據您的CPU架構,您最終會填充多個核心中的一個,或者計算時間差異的唯一核心 。
至於你的數據結構:你可能需要類似於排序映射的東西,其中包含start作為鍵,持續時間作為值的一個字段。 您將獲取最接近的密鑰少於您的時間,並檢查存儲的標題是否仍然有效......或類似
“你認為1ms的延遲會太快嗎?” - 是的,並且它無法在每毫秒(特別是在加載時)啟動任務,您可以自己測試(下面的小例子)。
“這會讓系統陷入困境嗎?” - 實際上不是很多(我的意思是主要是CPU時間)。 如果您在循環中運行操作並且不會暫停,則會獲得更多負載。 您的系統將花費大量時間在上下文切換上開始您的任務,官員這是不可避免的開銷,但如果您執行非常簡單的任務,這個開銷將與您的有用工作量相當。
“嘗試使用這款超級快速計時器有什么危險嗎?” - 正如您在上面寫的“在毫秒是鍵的地圖中快速查找”時,您使用毫秒作為鍵,但您不會運行每毫秒,因此您的邏輯會被計算為已損壞。
static int inc = 0;
public static void main(String[] args) throws InterruptedException {
TimerTask timerTask = new TimerTask() {
public void run() {
inc++;
}
};
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 1);
Thread.sleep(500000);
timer.cancel();
timer.purge();
System.out.println(inc);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.