6

最近、開発ツールでイベントを記録するときに 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
4

1 に答える 1

10

Go では、JSON を静的に型付けされた構造に解析しています。JS と Ruby では、ハッシュ テーブルに解析しています。

JSON を定義した構造に解析するために、json パッケージはそれらのフィールドの名前とタイプを見つける必要があります。これを行うために、reflect パッケージを使用します。これは、これらのフィールドに直接アクセスするよりもはるかに低速です。

データを解析した後に何をするかによっては、余分な解析時間は元が取れるかもしれません。Go データ構造は、ハッシュ テーブルよりも少ないメモリを使用し、アクセスがはるかに高速です。そのため、データを大量に処理する場合、処理時間の節約は余分な解析時間よりも重要になる場合があります。

于 2013-07-11T23:44:52.600 に答える