Issue #6401 has been updated by luislavena (Luis Lavena).


jmthomas (Jason Thomas) wrote:
> Is there some reason that the file reading got so messed up between 193p0 and now? Was there a refactor / rewrite of this fundamental operation?

Short answer: yes, there was a refactor of IO on Windows that lead a speed increase in both writing and reading big files. Seems there are corner cases that weren't covered by tests.

Long answer: both 1.9.2 and 1.9.3-p0 suffered from really slow IO reading and writing of files on Windows. This was caused primarily due newline conversion was performed always, even if was no required or the content already contained newlines.

The refactoring solved that issue and covered most of the cases exposed by tests boosting general IO operations on Windows.

However, there are cases like the one you exposed weren't covered by tests and thus, failed to get solved properly.

This refactor was introduced in 1.9.3 considering there will be another full year until Ruby 2.0 gets released. Since 1.9.2 Ruby has been getting slower and slower on Windows.

Instead of waiting to 2.0 to find and fix all those performance issues, we decided to start making a more usable Ruby today.

Hope that helps to understand the reasoning of these changes.

----------------------------------------
Bug #6401: Windows bug with File.pos
https://bugs.ruby-lang.org/issues/6401#change-26513

Author: jmthomas (Jason Thomas)
Status: Assigned
Priority: Normal
Assignee: h.shirosaki (Hiroshi Shirosaki)
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3p194 (2012-04-20) [i386-mingw32]


On Windows since Ruby 1.9.3p125 there have been issues with File.pos and File.readline. Ruby 1.9.3p0 does not have this issue. I have created the following test:

  def test_pos_with_readline
    t = make_tempfile
    random = Random.new(1234)
    open(t.path, "w") do |f|
      500.times do
        f.puts "X"*random.rand(80)
      end
    end
    i = 0
    lines = open(t.path,'r').read.split("\n")
    open(t.path, "r") do |f|
      lines.length.times do
        f.pos
        assert_equal lines[i], f.readline.chomp
        i += 1
      end
    end
  end

If you comment out the f.pos line this test case will pass. I originally submitted issue #6179 but the fixes applied there made things better but did not complete solve the problem. I apologize for the test case but it requires many lines with newlines to reproduce.


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