簡體   English   中英

Nodejs 中的 JS performance.now() 和 console.time() 不准確?

[英]JS performance.now() and console.time() inaccurate in Nodejs?

我對 JS 比較陌生,並試圖對一些代碼進行基准測試(以研究各種算法的性能),這樣我就可以看到在我的終端上運行時需要多長時間。 我原來有:

function benchmark(callback, name = `${callback+""}`) { // Convert callback to literal string if no name provided
  console.log(`${name}`);
  console.time("time");
  console.log(`\t${callback}`);
  console.timeEnd("time");
  console.log('\n');
}

但是,我沒有收到運行該功能所需的時間。 例如,我的輸出表明找到第 6 個斐波那契數比找到第 50 個需要更長的時間。

示例 1:

function fib(n) {
  if (n === 1 || n === 2) return 1;
  return fib(n - 1) + fib(n - 2);
}

當我運行時:

benchmark(fib(6), "fib(6) Rep 1");    // 0.5449770092964172ms
benchmark(fib(50), "fib(50) Rep 1"); //  0.004218995571136475ms

fib(50)完成需要更長的時間,但測量的時間更短!

通過performance.now()修改的基准也不起作用

如果我使用performance.now()我會遇到上述相同的問題。

const {performance} = require('perf_hooks');
function benchmark(callback, name = `${callback+""}`) {
  let t0 = performance.now();
  let result = callback;
  let t1 = performance.now();
  console.log(`\t${result}`);
  console.log(`time: ${t1 - t0}ms`);
  console.log('\n');
};

我懷疑計時器會隨機停止或在通話結束之前停止。 我應該將回調轉換為承諾,並使用.thenawait嗎? 或者我是否遺漏了一些關於 JS 的更基本的東西(比如事件循環或調用堆棧)?

我經歷了:

Klaycon在上面的評論中為我解決了這個問題,但由於某種原因無法發布答案。 我傳入了一個數字(而不是回調); 我正在評估計時器之前的回調。

要解決我的問題,我首先需要將實際回調傳遞到我的benchmark()函數中:

  benchmark( () => fib(6), "fib(6) Rep 1");

然后我需要在我的基准函數本身中調用我的回調:

function benchmark(callback, name = `${callback + ""}`) {
  console.log(`${name}`);
  console.time("time");
  console.log(`\t${callback()}`);          // ##### CHANGE HERE ######
  console.timeEnd("time");
  console.log('\n');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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