目次

目次

Node.jsでナノ秒を扱う関数hrtime

鈴木
鈴木
最終更新日2018/07/10 投稿日2018/07/10

ストップウォッチに悩む

私はよく、技術の調査や新しいコンポーネントなどの優劣の比較をする際に、ターンアラウンドタイムやスループットを計測するため処理時間を計測してグラフにしたりということをしています。 時間を計測するのは結構難しくて、C#ではStopwatchというクラスが実装されていて便利なんですが、おおよその言語ではそういったものは用意されていません。 なので目的の時間がかかりそうな処理やAPIの前後などでUNIX時間を取得して引き算してかかった時間を計測する、というような感じになります。 汎用的に作ろうとすればインターバルとか再スタートとか便利な機能を盛り込んだりできますがその為には言語レベル的にクラスを使えたりクロージャを使えたりといったことができなければいけないため諦めることがほとんどです。

本題

で、Node.jsでも同じようにこんな感じで計測できます。

start = new Date()
# ==すごくじかんがかかるしょり==
1 + 1
# =======================
end = new Date()
console.log(end - start)

ほかにもconsole.timeという関数があるのでこちらでも計測可能です

console.time("sw")
# ==すごくじかんがかかるしょり==
1 + 1
# =======================
console.timeEnd("sw")

とやると

sw: 32.024ms

というように返却されます。こちらだとマイクロ秒まで計測できますね。

ちなみに、console.time関数を知らなくて、新しいバージョンで実装されたんだろうと思ったんですがよくわかりませんでした。 geckoやtridentでないIE系?では使えないものや非推奨であるという記述を見かけたので どのバージョンから実装されたのかな?と思ったのですがecmaの仕様などを見てもなぜかconsoleに関する記述が見つかりませんでした・・・

ナノ戦場

で、console.timeではマイクロ秒まで計測できますが、時代はナノなのです。 「nodejs, nanotime」とかで検索するといろいろパッケージがでてきますが、そういったものを使うのは負けなのでそれらを解析して中身でなにやってるのか解析して自力でやります。

hrtime

ナノ秒を扱うのにはhrtimeという関数を使っているようです。何の略? https://nodejs.org/api/process.html#process_process_hrtime_time

ドキュメントいわくこれを実行すると[秒、ナノ秒]という配列が返ってくるようです。 しかもこの配列のまま引数として渡すと差分を返してくれるそうです。

nano = process.hrtime()

process.nextTick ->
  diff = process.hrtime(nano)
  console.log diff[0] * 1e9+ diff[1]
1436492

できました!

まとめ

ここまで細かい数字がわかるようになるとDBから取得してきたdatarawをそのまま構造体に入れて処理するのではなく行少な目で処理したり、配列に入れる文字列をちょいと圧縮してやるだけで差が出てくるようになります。 部分的に最適化するのが好きな人にオススメ!

鈴木

和服とvapeとСистемаと醗酵とたまごふわふわとカッティングシェイプスとジャージークラブとjuke/fwkに傾倒する人です

目次