Feature #2372
closedread_all() with buffering
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
        
          
          Updated by mame (Yusuke Endoh) almost 16 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) almost 16 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) almost 16 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) almost 16 years ago
          
          
        
        
      
      - Status changed from Open to Closed
 
=begin
ではコミットさせていただきます。
計測にお付き合い頂きありがとうございました。
=end
        
          
          Updated by wanabe (_ wanabe) almost 16 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) almost 16 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) almost 16 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