[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Bug: Ruby 1.9.1 File io on Windows is slooooow

Damjan Rems

3/27/2009 1:35:00 PM


This simple code shows everything:

time = [Time.new]
c = ''
'aaaa'.upto('zzzz') {|e| c << e}
3.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]}" }

ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
"0 0.537075"
"1 0.696244"
"2 40.188834"

ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
"0 0.551"
"1 0.133"
"2 0.087"

That is about 5x slower write and 500x read operation. Times are the
same if I do:
f = File.new('out.file','r')
c = f.read
f.close

Tried on two machines. Vista SP1 and XP SP3. Same results.


by
TheR


P.S.
Where can I officaly report a Ruby bug?
--
Posted via http://www.ruby-....

6 Answers

Alex Fenton

3/27/2009 2:16:00 PM

0

Damjan Rems wrote:
> This simple code shows everything:
>
> time = [Time.new]
> c = ''
> 'aaaa'.upto('zzzz') {|e| c << e}
> 3.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]}" }
>
> ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
> "0 0.537075"
> "1 0.696244"
> "2 40.188834"
>
> ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
> "0 0.551"
> "1 0.133"
> "2 0.087"

I'm pretty sure from your other message that it's using Ruby 1.9 with
UTF-8 encoded strings that kills performance. I get equivalent results
on OS X comparing 1.8.6 to 1.9.1 on common string operations like
String#[](a_fixnum).

It's understandable that correct character-wise operations are much
harder for Ruby to implement efficiently on variable-byte-length
encodings like UTF-8. Unfortunately, though I was delighted to get
proper encoding support in 1.9, the performance hit on strings was a
killer on my string-intensive GUI app.

There are sometimes ways round this (eg I rewrote diff/lcs to use string
character enumerators rather than repeated expensive calls to String#[]).

I expect the Ruby team are already aware of the problem, and I hope this
is a top priority for 1.9.2.

btw, you can report bugs at:
http://redmine.ruby...

alex


The Higgs bozo

3/27/2009 3:23:00 PM

0

Alex Fenton wrote:
>
> There are sometimes ways round this (eg I rewrote diff/lcs to use string
> character enumerators rather than repeated expensive calls to
> String#[]).
>
> I expect the Ruby team are already aware of the problem, and I hope this
> is a top priority for 1.9.2.

Unfortunately it appears to be a designed-in pessimization, though I
initially thought it was a mistake when I saw it. Guido van Rossum (the
Python creator) probably did too, as he asked Matz about it at the
40-minute mark here

http://www.youtube.com/watch?v=o...

--
Posted via http://www.ruby-....

Nobuyoshi Nakada

3/28/2009 2:23:00 AM

0

Hi,

At Fri, 27 Mar 2009 23:16:38 +0900,
Alex Fenton wrote in [ruby-talk:332264]:
> I'm pretty sure from your other message that it's using Ruby 1.9 with
> UTF-8 encoded strings that kills performance. I get equivalent results
> on OS X comparing 1.8.6 to 1.9.1 on common string operations like
> String#[](a_fixnum).

Slow-read is caused by universal-newline.

--
Nobu Nakada

Damjan Rems

3/29/2009 7:20:00 AM

0

Nobuyoshi Nakada wrote:
> Hi,
>
> At Fri, 27 Mar 2009 23:16:38 +0900,
> Alex Fenton wrote in [ruby-talk:332264]:
>> I'm pretty sure from your other message that it's using Ruby 1.9 with
>> UTF-8 encoded strings that kills performance. I get equivalent results
>> on OS X comparing 1.8.6 to 1.9.1 on common string operations like
>> String#[](a_fixnum).
>
> Slow-read is caused by universal-newline.

Should'nt fread be reading binary file or should that be forced by 'rb'
parameter at file.open()

I did fast test on Ubuntu x64 Linux. And the problem does not exist.
Althow it was Ruby version 1.9.0.


by
TheR

--
Posted via http://www.ruby-....

Robert Klemme

3/29/2009 11:05:00 AM

0

2009/3/27 Damjan Rems <d_rems@yahoo.com>:
>
> This simple code shows everything:
>
> time = [Time.new]
> c = ''
> 'aaaa'.upto('zzzz') {|e| c << e}
> 3.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]}" }
>
> ruby 1.9.1p0 (2009-01-30 revision 21907) [i386-mswin32]
> "0 0.537075"
> "1 0.696244"
> "2 40.188834"
>
> ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32]
> "0 0.551"
> "1 0.133"
> "2 0.087"
>
> That is about 5x slower write and 500x read operation.

Do you have a virus scanner on that Windows box? If so, how are
measurements when switched off?

Cheers

robert

--
remember.guy do |as, often| as.you_can - without end

Damjan Rems

3/30/2009 5:43:00 AM

0

Robert Klemme wrote:
> 2009/3/27 Damjan Rems <d_rems@yahoo.com>:
>> c = File.open('out.file','r') { |f| f.read }
>> "1 0.133"
>> "2 0.087"
>>
>> That is about 5x slower write and 500x read operation.
>
> Do you have a virus scanner on that Windows box? If so, how are
> measurements when switched off?
>
> Cheers
>
> robert

I swithed it off and times are pretty much the same.

by
TheR
--
Posted via http://www.ruby-....