簡體   English   中英

1ms Java定時器延遲太快了嗎?

[英]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。

取決於

問自己這些問題:

  • 我經常需要檢查這個值嗎?
  • 有多快可以接受
  • 願意為此任務犧牲多少系統CPU時間?

一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM