Project

General

Profile

Feature #6440

Updated by nobu (Nobuyoshi Nakada) about 8 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