Time#_loadがやたら重い
1000個で6秒程かかる.to_iしてMarshal.dumpなら0.01秒くらい.タイムゾーンとかインスタンス変数とかなくなるけど.って精度が下がるか.
それにしてもかかりすぎじゃない?
require 'benchmark' class C def initialize(sec) @t = Time.at(sec) end def _dump(limit) Marshal.dump(@t.to_i, limit) end def self._load(str) @t = Time.at(Marshal.load(str)) end end t = Time.now s = Marshal.dump(t) i = Marshal.dump(t.to_i) c = Marshal.dump(C.new(t.to_i)) n = 1000 Benchmark.bmbm(7) {|_| _.report("marshal:") { n.times { time = Marshal.load(s) } } _.report("fixnum:") { n.times { time = Time.at(Marshal.load(i)) } } _.report("user:") { n.times { time = Marshal.load(c) } } }
Rehearsal -------------------------------------------- marshal: 0.410000 1.820000 2.230000 ( 6.782736) fixnum: 0.010000 0.000000 0.010000 ( 0.004417) user: 0.000000 0.000000 0.000000 ( 0.007743) ----------------------------------- total: 2.240000sec user system total real marshal: 0.420000 1.820000 2.240000 ( 6.779039) fixnum: 0.000000 0.000000 0.000000 ( 0.003146) user: 0.010000 0.000000 0.010000 ( 0.006843)
流石にここまで遅いと困る.秒単位で十分だから適当に_dump/load定義してしまおうか.
totalとreadのかけ離れ具合もなんなんだろう.