JavaScript μs精度の実行速度計測 performance.now()

関数の時間計測の関数や簡単な使い方をまとめました。 自分用のメモです。

performance.now()

  • ブラウザがJavascriptを実行し始めてからの経過時間が格納されている。
  • 下の例の場合は、347ms経過している。
  • 精度は5μs。
  • Date.now()は精度がms単位で精度が悪い。
  • Date.now()は一年の経過時間。
  • 演算速度的には、performance.now()とDate.now()100万回実施で、それぞれ69.11msと79.41msでほぼ同じ。
console.log(performance.now()); //-> 347.7546730041504
console.log(Date.now());     //-> 1646962623189

部分計測

  • startからresultまでの時間を計測して表示します。 
  • toPrecision(5)で有効数字桁5桁で表示。
  • 演算速度はバラつきがあるので、loopを回して複数回実施した方がより確かな比較になる。
  • forの方がwhileより2倍速いのでforがお薦め。
const start = performance.now();
for (let i=0; i<1000000; i++) {
  a = Date.now();
}
result =(performance.now()-start).toPrecision(5);
console.log('time:', result,'ms');
  • 上記はforの演算時間も含まれてしまうので、別途forだけの時間を測ってその時間を上記結果から引いたら更にいいと思います。
const start = performance.now();
for (let i=0; i<1000000; i++) {
}
result =(performance.now()-start).toPrecision(5);
console.log('time:', result,'ms');

関数の速度測定の関数

function measure(func, loop=1) {
  const start = performance.now();
  for (let i=0; i<loop; i++) {
     func();
  }
  result =(performance.now()-start).toPrecision(5);
  console.log('time:', result,'ms');
  return result;
}

function myFunc(){
   a=123..toString();
}
measure(myFunc, 1000000); //-> 21.862ms

簡単な計測 console.time();

簡単に使えます。()内のtimerNameはconsole.timeとconsole.timeEndと合わせておく必要があります。

  • 差を取らなくていい。
  • 整形しなくてもラベルと単位(ms)も付けてくれる。

しかしconsole.timeは非標準で将来振る舞いが変わるかもしれないし、公開されているウェブサイトで使用しないように書かれています。 『Mdn Web docs console.timeEnd』

console.time('ichiri');
for (let i=0; i<1000000; i++) {
  a = Date.now();
}
console.timeEnd('ichiri');
ichiri: 139.56494140625 ms
ichiri: 136.5439453125 ms
ichiri: 129.544921875 ms
ichiri: 136.77392578125 ms
ichiri: 133.599853515625 ms
ichiri: 129.654052734375 ms
ichiri: 116.365234375 ms
ichiri: 130.52392578125 ms
ichiri: 127.690185546875 ms

コメント