最近、開発ツールでイベントを記録するときに Chrome Web ブラウザーが生成する JSON を解析し、そこからタイミング データを取得する必要がありました。Chrome は短時間で大量のデータを生成できるため、最初に作成した Ruby パーサーは非常に低速でした。
私は Go を学んでいるので、Go と JavaScript/Node の両方でスクリプトを書き、それらを比較することにしました。
JSON ファイルの最も単純な形式は、この Gistにあるものです。ページをフェッチするために送信されたリクエストを表すイベントと、レスポンスを表すイベントが含まれています。通常、ふるいにかける余分なデータが大量にあります。それはそれ自体の問題ですが、この質問で私が心配していることではありません。
私が書いた JavaScript スクリプトはここにあり、私が書いた Go プログラムはここにあります。これは私が Go で書いた最初の便利なものなので、あらゆる種類の悪いものだと確信しています。ただし、大きな JSON ファイルの解析は JavaScript よりもはるかに遅いことに気付きました。
Go での 119Mb JSON ファイルの時間:
$ time ./parse data.json
= 22 Requests
Min Time: 0.77
Max Time: 0.77
Average Time: 0.77
./gm data.json 4.54s user 0.16s system 99% cpu 4.705 total
JavaScript/Node での 119Mb JSON ファイルの時間:
$ time node parse.js data.json
= 22 Requests
Min Time: 0.77
Max Time: 0.77
Avg Time: 0.77
node jm.js data.json 1.73s user 0.24s system 100% cpu 1.959 total
(この例では、非常に大きなデータ セットを持つように JSON オブジェクトを複製したため、最小/最大/平均時間はすべて同じですが、それは関係ありません。)
JavaScript/Node の方が JSON の解析がはるかに高速なだけなのか (これは特に驚くべきことではないと思います)、それとも Go プログラムで何か完全に間違っているのか、私は興味があります。また、Go プログラム全般で何が間違っているのかにも興味があります。
これら 2 つのスクリプトは解析以上のことを行いますが、プログラムに多くの時間を追加しているのは間違いなく json.Unmarshal()
Go であることに注意してください。
アップデート
Rubyスクリプトを追加しました:
$ ruby parse.rb
= 22 Requests
Min Time: 0.77
Max Time: 0.77
Avg Time: 0.77
ruby parse.rb 4.82s user 0.82s system 99% cpu 5.658 total