在 Lobsters 上看到「Accurate Benchmarking」這篇,裡面提到了一個簡單的方式解決 loop 的 overhead 問題。
起因是有些 function 速度很快,要 benchmark 的時候通常會加上 loop,像是這樣:
const start = performance.now(); for (let i = 0; i < iterations; i++) { fn(); } const end = performance.now();
但這個方式算出來的時間包括了 loop 的 overhead,作者提出的概念是跑兩次迴圈,一個跑一次 fn()
,另外一個跑兩次 fn()
,兩個成績相減就可以把 loop overhead 消掉:
const start = performance.now(); for (let i = 0; i < iterations; i++) { fn(); fn(); } const end = performance.now();
算是個簡單的方法,應該是蠻多場景可以用的... 想得到會出問題的地方... 有 side effect 的 fn()
(像是有另外的空間存 cache,或是撞到 CPU cache 效應?),另外一種是 compiler 對這塊的 optimization 做的超強?