From: Jon Forums Date: 2011-11-10T23:46:32+09:00 Subject: [ruby-core:40912] [ruby-trunk - Feature #5562] Improvement of Windows IO performance Issue #5562 has been updated by Jon Forums. Thank you and I will try `make test-all TESTS='-v'` From my perspective, our challenge is to prove the patch works well against the current tests while keeping the issue from stagnating. It's great that the patch passes `make test` and `make test-all TESTS='openssl fiddle psych'`. It would be even nicer if `make test-all` functioned properly on MinGW so we could run all the current tests. However, this may not be practical or required. To continue making forward progress, should we split the concerns into two issues? First, let's identify the minimal set of current tests that will persuade us that your patch is safe, as your patch has already proven itself to be a significant usage benefit for Windows 1.9 users. For example, if your patch passes `make test && make test-all TESTS='zlib openssl fiddle psych'` are you and other ruby-core committers OK with committing your patch to `ruby_1_9_3` and `trunk`? If not, what other tests should be added to TESTS? Second, let's create a separate feature request to address the longer term test-all challenges on Windows. I personally like your `skip` idea and think it could be refined a bit. For example, could the `skip` method be hoisted into `test/runner.rb` (or even a new `test/test_helper.rb`) to allow for easy integration of platform and MRI version guards into the existing test suite? Also, should the platform matching use `RbConfig::CONFIG['host_os']` instead? Perhaps I'm just not aware of existing platform guard-like capability using TESTS or other tricks. I'm hoping we can find a clean (meaning, easy to retrofit into existing tests and easy-to-use) solution similar to http://rubyspec.org/guards/ I also hope that people don't resuscitate the old tests vs. RubySpec discussion, but rather, keep the focus on finding a pragmatic solution that enhances the existing test infrastructure. I strongly believe that when building on Windows (whether MinGW or VC++) one should be able to run `[n]make && [n]make test && [n]make test-all` to help verify the correctness of a build. The reason I'm advocating splitting out the testing issue is so we can keep the focus on testing the safeness of your patch *and* keep moving forward on getting your patch accepted. How should we proceed? ---------------------------------------- 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