[#45637] [ruby-trunk - Feature #6440][Open] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい — "Glass_saga (Masaki Matsushita)" <glass.saga@...>

14 messages 2012/05/16

[#45670] [ruby-trunk - Bug #6479][Open] ipaddr.rbの受け付ける書式が、プラットフォームによって異なる — "kachick (Kenichi Kamiya)" <kachick1+ruby@...>

9 messages 2012/05/22

[ruby-dev:45642] [ruby-trunk - Feature #6440] 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい

From: "nobu (Nobuyoshi Nakada)" <nobu@...>
Date: 2012-05-17 04:22:56 UTC
List: ruby-dev #45642
Issue #6440 has been updated by nobu (Nobuyoshi Nakada).


=begin
細かい問題を修正すればいいんじゃないですかね。

* struct load_arg.bufのメモリリーク
* r_bytes1_partial()でreadpartialでの不足分をreadで追加したときにtmp_ptrが不正

あとは感想をいくつか。

* arg->partialをフラグにするよりsymbolを持たせてはどうか
* r_bytes()とr_bytes0()の追加部分は関数に分けることはできないだろうか
* 予約語(if)とカッコの間が空いていない
=end

----------------------------------------
Feature #6440: 引数にIOを渡した場合のMarshal.loadにバッファを持たせたい
https://bugs.ruby-lang.org/issues/6440#change-26676

Author: Glass_saga (Masaki Matsushita)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: core
Target version: 2.0.0


現在のMarshal.loadでは、引数にIOを渡すとIO#getbyteやIO#readで当座に必要な部分のみの読み出しを繰り返すので
大量のメソッド呼び出しが発生し、そのコストが無視できません。
そこで、引数に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

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を添付します。


-- 
http://bugs.ruby-lang.org/

In This Thread