Feature #2372
closedread_all() with buffering
Added by wanabe (_ wanabe) about 15 years ago. Updated over 13 years ago.
Description
=begin
io.c の read_all() で、変換が必要な場合の処理が少し重いようだったので
バッファに少し溜めてから io_shift_cbuf() を呼び出すようにするパッチを書きました。
溜めるバイト数は io_shift_cbuf() 中にあった式を参考にしています。
ベンチマークスクリプトとその結果を併せて添付します。
bm_io_file_read.rb を参考に、エンコーディングやモードを複数試すようにしています。
Windwos 以外では 'r' モードは 'rb' モードと同じ結果になると思います。
最大で約 2.8 倍速を計測しましたが、変換が複雑な場合には差は縮まり、
また当然ながら短いファイルではほとんど差は出ませんでした。
どなたかもし興味を持っていただけたら、Windows でない、または十分速い環境で
同様に速度が改善するかどうか試していただけると助かります。
=end
Files
buffering_readall.patch (1.1 KB) buffering_readall.patch | wanabe (_ wanabe), 11/15/2009 09:21 PM | ||
test.rb (565 Bytes) test.rb | wanabe (_ wanabe), 11/15/2009 09:21 PM | ||
log.txt (2.06 KB) log.txt | wanabe (_ wanabe), 11/15/2009 09:21 PM |
Updated by mame (Yusuke Endoh) about 15 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
Updated by naruse (Yui NARUSE) about 15 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
Updated by matz (Yukihiro Matsumoto) about 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39699] 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
Updated by wanabe (_ wanabe) about 15 years ago
- Status changed from Open to Closed
=begin
ではコミットさせていただきます。
計測にお付き合い頂きありがとうございました。
=end
Updated by wanabe (_ wanabe) about 15 years ago
=begin
ワナベです。
2009/11/16, Tanaka Akira akr@fsij.org:
In article 4b0081d7e73af_8bc5c2a894735e@redmine.ruby-lang.org,
_ wanabe redmine@ruby-lang.org writes:チケット #2372 が更新されました。 (by _ wanabe)
ステータス OpenからClosedに変更
ではコミットさせていただきます。
そのコミット以降、以下のような失敗が発生しています。
すみません、ご指摘ありがとうございます。
見落としていました。取り急ぎ、rb_protect でくくるようにして再度コミットしました。
--
ワナベ
=end
Updated by wanabe (_ wanabe) about 15 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
Updated by matz (Yukihiro Matsumoto) about 15 years ago
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:39708] 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