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

Node.js

この記事は最終更新日から1年以上が経過しています。

ストップウォッチに悩む

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

本題

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

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

とやると

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

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

ナノ戦場

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

hrtime

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

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

できました!

まとめ

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

この記事を書いた人

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

Node.js