[英]What happens when setTimeout < 5 node.js
當X-> 0時找出setTimeout(fn, X)
的真實行為。
我正在開發使用setTimeout()
進行QPS(每秒查詢)測試的工具。 最近,當我對1000 QPS進行測試時感到很驚訝,該測試大約需要5秒鍾才能執行,而應該花1秒鍾(不計算任何其他外部因素)。
對於較低的QPS值(例如,波紋管100),該測試工作正常。
在調查過程中,我發現一些文章解釋說,在進行setTimeout(fn, X)
調用時,當X趨於0時,如果X太小,它將被修整到更高的值。
從2011年的這個問題中可以看到一個示例,其中舊規范指定如果setTimeout(fn, X)
其中X <= 3,則X將自動設置為4。
這意味着在兩次執行setTimeout()
之間,我可以等待的最短時間為4毫秒。 如果我有setTimeout(fn, 1)
,它將被轉換為setTimeout(fn, 4)
。
我看到的每篇文章都有不同的說法,在我先前發布的問題中,不同的答案也有不同的說法。 總體而言,所有結論似乎都是“ 沒有結論,因為行為高度不一致 ”。
回到node.js,由於我指出的問題已經很老了,所以我想對以下內容進行更新:
setTimeout(fn, X)
如何工作? 我想要有關setTimeout()
更多信息,因此可以圍繞它構建我的代碼。 鏈接到文檔和文章日期或找到答案的鏈接將受到高度贊賞。
謝謝您的幫助!
它與事件循環有關。 想象一堆命令,node.js依次執行。
setTimeout
是(簡化版本)“將其放在堆的最后,不要在X毫秒之前執行”。
因此,盡管可以確定至少要等待那個時間,但是仍然需要等待node.js才能使該任務回到堆的頂部,這可能需要一些時間(毫秒級)。
這就是為什么建議使用process.nextTick
,它將任務放在堆的頂部,而不是setTimeout(callback, 0)
。
因此,在您的示例中, setTimeout(callback, 1)
不會在內部轉換為setTimeout(callback, 4)
,只是一旦計時器過去,node.js在返回該任務之前會有3ms的開銷。 如果事件循環中沒有其他內容,並且您的處理器運行速度很快,那么您也許可以再減少一毫秒,但是node.js並未構建為在該級別處理對時間敏感的任務。 這將使它進入實時編程領域,這是完全另一種用途。
setTimeout
,在大多數用例中, setTimeout
只能處理幾秒鍾,因此大約1000ms。 2〜3ms真的給您帶來不便嗎?
process.nextTick
還將允許node.js清除事件隊列,並防止RangeError: Maximum call stack size exceeded
當您鏈接許多異步調用時, RangeError: Maximum call stack size exceeded
異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.