ちなみに

火曜日の空は僕を押しつぶした。

YAML と JSON どっちが速いの

最初に (tl;drなんて言わないぞ)

結論からいうとJSONの方が10倍速かった。

概要

基本的にマスタデータはYAMLで管理するようにしているのだけれどなぜかJSONでプルリク貰ってイライラしながらベンチとって証拠にしようとしたら予想と逆だった。一定以上のサイズになるとYAMLが逆転するものだと思っていた。

ベンチ結果

以下のようなファイルを読み込む。

➜  ls -lh story.yml story.json                                                                                                                                                    2.1.2 11:30:20
-rw-r--r--  1 tomohiro  staff    13K  7 17 11:15 hoge.json
-rw-r--r--  1 tomohiro  staff    11K  7 17 11:15 hoge.yml

結果は以下のようになった。JSONの方が10倍くらい速い。圧倒的過ぎてなんとも言えない。

Rehearsal ----------------------------------------
JSON   0.040000   0.000000   0.040000 (  0.038241)
YAML   0.380000   0.000000   0.380000 (  0.382941)
------------------------------- total: 0.420000sec

           user     system      total        real
JSON   0.030000   0.010000   0.040000 (  0.032264)
YAML   0.370000   0.000000   0.370000 (  0.368527)

ファイルサイズを増やして1MB以上のファイルで試したところ以下のようになった。 よりYAMLが遅くなっている。全然認識と違って調べて良かったという感じ。

Rehearsal ----------------------------------------
JSON   4.270000   0.200000   4.470000 (  4.485176)
YAML  44.640000   0.310000  44.950000 ( 44.982451)
------------------------------ total: 49.420000sec

           user     system      total        real
JSON   4.240000   0.300000   4.540000 (  4.537489)
YAML  43.530000   0.340000  43.870000 ( 43.896849)

以下のコードでベンチ取った。

require "benchmark"
require "oj"
require "psych"

Benchmark.bmbm do |x|
  x.report("JSON") { 100.times { Oj.load(File.open("hoge.json")) } }
  x.report("YAML") { 100.times { Psych.load(File.open("hoge.yml")) } }
end

oj はなんか速いやつ ( see also: https://github.com/ohler55/oj )