Feature #2372

read_all() with buffering

Added by _ wanabe over 5 years ago. Updated about 4 years ago.

[ruby-dev:39696]
Status:Closed
Priority:Low
Assignee:-

Description

=begin
io.c の read_all() で、変換が必要な場合の処理が少し重いようだったので
バッファに少し溜めてから io_shift_cbuf() を呼び出すようにするパッチを書きました。
溜めるバイト数は io_shift_cbuf() 中にあった式を参考にしています。

ベンチマークスクリプトとその結果を併せて添付します。
bm_io_file_read.rb を参考に、エンコーディングやモードを複数試すようにしています。
Windwos 以外では 'r' モードは 'rb' モードと同じ結果になると思います。

最大で約 2.8 倍速を計測しましたが、変換が複雑な場合には差は縮まり、
また当然ながら短いファイルではほとんど差は出ませんでした。

どなたかもし興味を持っていただけたら、Windows でない、または十分速い環境で
同様に速度が改善するかどうか試していただけると助かります。
=end

buffering_readall.patch Magnifier (1.1 KB) _ wanabe, 11/15/2009 09:21 PM

test.rb Magnifier (565 Bytes) _ wanabe, 11/15/2009 09:21 PM

log.txt Magnifier (2.06 KB) _ wanabe, 11/15/2009 09:21 PM

History

#1 Updated by Yusuke Endoh over 5 years ago

=begin
遠藤です。

2009年11月15日21:21 _ wanabe redmine@ruby-lang.org:

io.c の read_all() で、変換が必要な場合の処理が少し重いようだったので
バッファに少し溜めてから io_shift_cbuf() を呼び出すようにするパッチを書きました。
溜めるバイト数は io_shift_cbuf() 中にあった式を参考にしています。

パッチの内容は理解していませんが

最大で約 2.8 倍速を計測しましたが、変換が複雑な場合には差は縮まり、
また当然ながら短いファイルではほとんど差は出ませんでした。

どなたかもし興味を持っていただけたら、Windows でない、または十分速い環境で
同様に速度が改善するかどうか試していただけると助かります。

Debian で試してみました。最大 2.8 倍くらいでした。

$ ./ruby test.rb
user system total real
short r 0.310000 0.190000 0.500000 ( 0.489743)
short r:us-ascii:utf-8 0.760000 0.220000 0.980000 ( 0.984798)
short r:us-ascii:utf-16le 1.030000 0.270000 1.300000 ( 1.293715)
short rb 0.260000 0.220000 0.480000 ( 0.480045)
short rb:us-ascii:utf-8 0.730000 0.260000 0.990000 ( 1.005522)
short rb:us-ascii:utf-16le 1.050000 0.250000 1.300000 ( 1.311958)
long r 0.040000 0.020000 0.060000 ( 0.057341)
long r:us-ascii:utf-8 3.800000 0.020000 3.820000 ( 3.817237)
long r:us-ascii:utf-16le 7.840000 0.040000 7.880000 ( 7.956883)
long rb 0.020000 0.030000 0.050000 ( 0.052485)
long rb:us-ascii:utf-8 3.830000 0.030000 3.860000 ( 3.867369)
long rb:us-ascii:utf-16le 7.960000 0.020000 7.980000 ( 8.031679)

$ ./ruby.org test.rb
user system total real
short r 0.280000 0.190000 0.470000 ( 0.459421)
short r:us-ascii:utf-8 0.830000 0.190000 1.020000 ( 1.023667)
short r:us-ascii:utf-16le 1.160000 0.180000 1.340000 ( 1.349957)
short rb 0.250000 0.210000 0.460000 ( 0.454870)
short rb:us-ascii:utf-8 0.850000 0.170000 1.020000 ( 1.019038)
short rb:us-ascii:utf-16le 1.100000 0.240000 1.340000 ( 1.339989)
long r 0.020000 0.040000 0.060000 ( 0.053929)
long r:us-ascii:utf-8 11.730000 0.020000 11.750000 ( 11.753191)
long r:us-ascii:utf-16le 15.880000 0.040000 15.920000 ( 15.969792)
long rb 0.020000 0.020000 0.040000 ( 0.046306)
long rb:us-ascii:utf-8 11.020000 0.030000 11.050000 ( 11.038415)
long rb:us-ascii:utf-16le 15.400000 0.020000 15.420000 ( 15.425342)

$ ./ruby -v
ruby 1.9.2dev (2009-11-14 trunk 25768) [i686-linux]

--
Yusuke ENDOH mame@tsg.ne.jp

=end

#2 Updated by Yui NARUSE over 5 years ago

=begin
成瀬です。

_ wanabe wrote:

io.c の read_all() で、変換が必要な場合の処理が少し重いようだったので
バッファに少し溜めてから io_shift_cbuf() を呼び出すようにするパッチを書きました。
溜めるバイト数は io_shift_cbuf() 中にあった式を参考にしています。

あー、なるほど、IO の待ちよりも、transcode の呼び出し (more_char の処理 ?)
の方が遅いって話ですね。
思うに妥当な指摘で、うちでも速くなりました。

% ruby19.orig test.rb
user system total real
short r 0.335938 1.000000 1.335938 ( 1.328293)
short r:us-ascii:utf-8 1.210938 0.867188 2.078125 ( 2.082787)
short r:us-ascii:utf-16le 1.648438 1.007812 2.656250 ( 2.658761)
short rb 0.335938 0.812500 1.148438 ( 1.152713)
short rb:us-ascii:utf-8 1.289062 0.984375 2.273438 ( 2.304020)
short rb:us-ascii:utf-16le 1.531250 0.906250 2.437500 ( 2.445138)
long r 0.023438 0.101562 0.125000 ( 0.121755)
long r:us-ascii:utf-8 14.703125 0.101562 14.804688 ( 14.856436)
long r:us-ascii:utf-16le 24.406250 0.062500 24.468750 ( 24.553504)
long rb 0.031250 0.078125 0.109375 ( 0.106960)
long rb:us-ascii:utf-8 13.179688 0.039062 13.218750 ( 13.273193)
long rb:us-ascii:utf-16le 23.031250 0.062500 23.093750 ( 23.153640)

% ruby19 test.rb
user system total real
short r 0.328125 0.703125 1.031250 ( 1.031874)
short r:us-ascii:utf-8 1.226562 0.867188 2.093750 ( 2.121321)
short r:us-ascii:utf-16le 1.601562 0.742188 2.343750 ( 2.341433)
short rb 0.335938 0.695312 1.031250 ( 1.025165)
short rb:us-ascii:utf-8 1.171875 0.781250 1.953125 ( 1.958811)
short rb:us-ascii:utf-16le 1.578125 0.875000 2.453125 ( 2.512860)
long r 0.023438 0.093750 0.117188 ( 0.122622)
long r:us-ascii:utf-8 6.625000 0.046875 6.671875 ( 6.786332)
long r:us-ascii:utf-16le 13.507812 0.054688 13.562500 ( 13.699172)
long rb 0.015625 0.093750 0.109375 ( 0.108933)
long rb:us-ascii:utf-8 6.632812 0.046875 6.679688 ( 6.703453)
long rb:us-ascii:utf-16le 13.515625 0.046875 13.562500 ( 13.641543)

% ruby19 -v
ruby 1.9.2dev (2009-11-14 trunk 25768) [x86_64-freebsd8.0]

--
NARUSE, Yui naruse@airemix.jp

=end

#3 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: [Feature #2372] read_all() with buffering"
on Mon, 16 Nov 2009 00:19:25 +0900, "NARUSE, Yui" naruse@airemix.jp writes:
|_ wanabe wrote:
|> io.c の read_all() で、変換が必要な場合の処理が少し重いようだったので
|> バッファに少し溜めてから io_shift_cbuf() を呼び出すようにするパッチを書きました。
|> 溜めるバイト数は io_shift_cbuf() 中にあった式を参考にしています。
|
|あー、なるほど、IO の待ちよりも、transcode の呼び出し (more_char の処理 ?)
|の方が遅いって話ですね。
|思うに妥当な指摘で、うちでも速くなりました。

コミットしていただけませんか。wanabeさんが直接されるのが良い
と思います。

=end

#4 Updated by _ wanabe over 5 years ago

  • Status changed from Open to Closed

=begin
ではコミットさせていただきます。
計測にお付き合い頂きありがとうございました。
=end

#5 Updated by _ wanabe over 5 years ago

=begin
ワナベです。

2009/11/16, Tanaka Akira akr@fsij.org:

In article ,
_ wanabe redmine@ruby-lang.org writes:

チケット #2372 が更新されました。 (by _ wanabe)

ステータス OpenからClosedに変更

ではコミットさせていただきます。

そのコミット以降、以下のような失敗が発生しています。

すみません、ご指摘ありがとうございます。
見落としていました。取り急ぎ、rb_protect でくくるようにして再度コミットしました。

--
ワナベ

=end

#6 Updated by _ wanabe over 5 years ago

=begin
ワナベです。

2009/11/18, Tanaka Akira akr@fsij.org:

思うんですが、ワナベさんがやりたかったのはむしろ
ECONV_AFTER_OUTPUT を外したかったということなんじゃないです
かねぇ。

こうするとこちらでは速くなる感じですが、そちらではどうでしょ
う。

ありがとうございます。格段に速くなりました。

short r 3.093000 6.422000 9.515000 ( 9.734375)
short r:us-ascii:utf-8 4.469000 7.031000 11.500000 ( 12.171875)
short r:us-ascii:utf-16le 5.688000 7.156000 12.844000 ( 13.375000)
short rb 1.906000 5.875000 7.781000 ( 8.031250)
short rb:us-ascii:utf-8 3.906000 6.344000 10.250000 ( 10.609375)
short rb:us-ascii:utf-16le 4.297000 7.047000 11.344000 ( 11.937500)
long r 1.969000 0.219000 2.188000 ( 2.218750)
long r:us-ascii:utf-8 13.407000 0.281000 13.688000 ( 14.093750)
long r:us-ascii:utf-16le 20.515000 0.344000 20.859000 ( 21.515625)
long rb 0.078000 0.203000 0.281000 ( 0.328125)
long rb:us-ascii:utf-8 1.625000 0.297000 1.922000 ( 2.031250)
long rb:us-ascii:utf-16le 12.891000 0.531000 13.422000 ( 13.968750)

--
ワナベ

=end

#7 Updated by Yukihiro Matsumoto over 5 years ago

=begin
まつもと ゆきひろです

In message "Re: Re: Feature #2372 read_all() with buffering"
on Wed, 18 Nov 2009 07:16:32 +0900, Tanaka Akira akr@fsij.org writes:

|思うんですが、ワナベさんがやりたかったのはむしろ
|ECONV_AFTER_OUTPUT を外したかったということなんじゃないです
|かねぇ。
|
|こうするとこちらでは速くなる感じですが、そちらではどうでしょ
|う。

コミットしてください。

=end

Also available in: Atom PDF