Project

General

Profile

Feature #6440

Updated by nobu (Nobuyoshi Nakada) almost 7 years ago

=begin 現在のMarshal.loadでは、引数にIOを渡すとIO#getbyteやIO#readで当座に必要な部分のみの読み出しを繰り返すので
現在の(({Marshal.load}))では、引数に(({IO}))を渡すと(({IO#getbyte}))や(({IO#read}))で当座に必要な部分のみの読み出しを繰り返すので
大量のメソッド呼び出しが発生し、そのコストが無視できません。
そこで、引数に(({IO}))を渡した場合の(({Marshal.load}))にバッファを持たせる事を提案します。

そこで、引数にIOを渡した場合のMarshal.loadにバッファを持たせる事を提案します。

require 'benchmark'

require 'tempfile'



ary = Array.new(1000){ "hoge" }

file = Tempfile.new("foo")

Marshal.dump(ary, file)



Benchmark.bm do |x|

x.report do

100.times do

file.rewind

Marshal.load(file)
end

end
end


end

file.close

上記のベンチマークでバッファを持つようにしたrubyとtrunkを比較したところ、以下の結果となりました。



trunk(r35660):

user system total real

1.880000 0.000000 1.880000 ( 1.874681)



proposed:

user system total real

0.180000 0.000000 0.180000 ( 0.178556)

patchを添付します。
=end

Back