Issue #5562 has been updated by Jon Forums.


Looks great so far. More info and profiling snapshot tomorrow, but here's what I get so far on my Win7 32bit:

C:\projects\rubyinstaller-git>rake ruby19 local=c:\Users\Jon\Documents\RubyDev\ruby-git nogems=1
...
sh-3.1$ make test-all TESTS='openssl fiddle psych'
...
638 tests, 3490 assertions, 0 failures, 0 errors, 1 skips
sh-3.1$ make test
PASS all 943 tests
...
KNOWNBUGS.rb .
PASS all 1 tests


Files used in micro-benchmarks below. Bottom line...with your patch, performance is much closer to binary-only read performance.

  https://github.com/jonforums/measurements/blob/master/workloads/core_brd_filelines_lf.rb
  https://github.com/jonforums/measurements/blob/master/workloads/core_rd_filelines_lf.rb


C:\projects\measurements-git>rci bench core_brd_filelines_lf
wio-ruby 1.9.3p0 (2011-11-08 revision 33661) [i386-mingw32]
Rehearsal ---------------------------------------------------------
core_brd_filelines_lf   0.827000   0.141000   0.968000 (  0.967202)
------------------------------------------------ total: 0.968000sec

                            user     system      total        real
core_brd_filelines_lf   0.811000   0.171000   0.982000 (  0.998401)

C:\projects\measurements-git>rci bench core_rd_filelines_lf
wio-ruby 1.9.3p0 (2011-11-08 revision 33661) [i386-mingw32]
Rehearsal --------------------------------------------------------
core_rd_filelines_lf   1.076000   0.187000   1.263000 (  1.263602)
----------------------------------------------- total: 1.263000sec

                           user     system      total        real
core_rd_filelines_lf   1.155000   0.125000   1.280000 (  1.294803)

----------------------------------------
Feature #5562: Improvement of Windows IO performance
http://redmine.ruby-lang.org/issues/5562

Author: Hiroshi Shirosaki
Status: Open
Priority: Normal
Assignee: 
Category: 
Target version: 


=begin
I suggest a patch to improve Windows IO performance.

Ruby's text mode IO is much slower than binary mode.
On Windows text mode is default, so Windows IO is slow.
I assume that's mainly because of CRLF linefeed code conversion.

My idea to improve IO performance is as below.
- Change default linefeed conversion from Universal newline to CRLF newline on Windows
- Use binary mode process with OS's text mode if only CRLF conversion is needed
- Use Ruby's text mode with universal newline conversion if encoding conversion is needed

Although that causes io.c code to be more complicated, IO with CRLF conversion performance seems to be improved much.
I confirmed "make test-all TEST=ruby" have been passed. There was 3 errors, but ruby without this patch had same errors.
I think this patch doesn't affect other OS.

Line endings of "p" or "puts" writing is LF on trunk, but CRLF on 1.8.7 or 1.9.2.
This patch reverts to CRLF.


Here is #1332 benchmark test and results.

time = [Time.new]
c = ''
'aaaa'.upto('zzzz') {|e| c << e}
4.times { c << c }
time << Time.new
File.open('out.file','w') { |f| f.write(c) }
time << Time.new
c = File.open('out.file','r') { |f| f.read }
time << Time.new
0.upto(time.size - 2) {|i| p "#{i} #{time[i+1]-time[i]}" }


- Result

ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mingw32]
"0 0.78125"
"1 0.6875"
"2 0.5625"

ruby 2.0.0dev (2011-11-03) [i386-mingw32]
"0 0.59375"
"1 1.09375"
"2 1.296875"

ruby 2.0.0dev (2011-11-03 trunk 33615) [i386-mingw32] with this patch
"0 0.625"
"1 0.65625"
"2 0.34375"
=end



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