# Code Review: Files3

**URL:** <https://www.ruby-forum.com/t/code-review-files3/167366>\
**Category:** IronRuby\
**Created:** [May 7, 2009, 2:23am UTC](https://www.ruby-forum.com/t/code-review-files3/167366 "2009-05-07T02:23:43Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![grujildo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/94ad74/32.png) [@grujildo](https://www.ruby-forum.com/u/grujildo)\
**Post date:** [May 7, 2009, 2:23am UTC](https://www.ruby-forum.com/t/code-review-files3/167366/1 "2009-05-07T02:23:43Z")

</div>

tfpt review “/shelveset:Files3;REDMOND\tomat”

Improves performance for file IO#read method.  
Previously we were 10x slower than MRI, now we are approx. 1.5-times  
faster.

Tomas

MRI:  
D:\temp\>ruby file.rb  
user system total real  
write big.txt  
6.287000 0.046000 6.333000 ( 6.337000)  
write big\_lines.txt  
0.265000 0.063000 0.328000 ( 0.327000)  
read big.txt  
100 x 1 x 10000000 3.635000 1.825000 5.460000 ( 5.463000)  
100 x 10 x 1000000 3.370000 2.122000 5.492000 ( 5.493000)  
100 x 1000 x 10000 3.900000 1.747000 5.647000 ( 5.650000)  
100 x 10000 x 1000 5.335000 1.326000 6.661000 ( 6.680000)  
10 x 100000 x 100 1.404000 0.218000 1.622000 ( 1.623000)  
10 x 1000000 x 10 10.858000 0.203000 11.061000 ( 11.065000)  
1 x 10000000 x 1 10.546000 0.000000 10.546000 ( 10.565000)  
read big\_lines.txt  
100 x 1 x 10000000 3.603000 1.888000 5.491000 ( 5.494000)  
100 x 10 x 1000000 3.479000 2.043000 5.522000 ( 5.525000)  
100 x 1000 x 10000 3.978000 1.716000 5.694000 ( 5.696000)  
100 x 10000 x 1000 5.179000 1.529000 6.708000 ( 6.711000)  
10 x 100000 x 100 1.451000 0.156000 1.607000 ( 1.607000)  
10 x 1000000 x 10 10.842000 0.203000 11.045000 ( 11.050000)  
1 x 10000000 x 1 10.530000 0.031000 10.561000 ( 10.581000)

IronRuby:  
D:\temp\>rbr file.rb  
user system total real  
write big.txt  
4.726830 0.046800 4.773631 ( 4.728769)  
write big\_lines.txt  
1.060807 0.046800 1.107607 ( 1.045636)  
read big.txt  
100 x 1 x 10000000 1.466409 1.216808 2.683217 ( 2.677968)  
100 x 10 x 1000000 2.168414 0.982806 3.151220 ( 3.150579)  
100 x 1000 x 10000 1.653611 0.826805 2.480416 ( 2.481799)  
100 x 10000 x 1000 2.433616 1.669211 4.102826 ( 4.105114)  
10 x 100000 x 100 0.811205 0.156001 0.967206 ( 0.967746)  
10 x 1000000 x 10 6.567642 0.124801 6.692443 ( 6.696175)  
1 x 10000000 x 1 6.255640 0.031200 6.286840 ( 6.290346)  
read big\_lines.txt  
100 x 1 x 10000000 1.762811 1.216808 2.979619 ( 2.981281)  
100 x 10 x 1000000 2.620817 0.780005 3.400822 ( 3.402718)  
100 x 1000 x 10000 1.840812 1.216808 3.057620 ( 3.059325)  
100 x 10000 x 1000 2.605217 1.950013 4.555229 ( 4.557770)  
10 x 100000 x 100 0.826805 0.171601 0.998406 ( 0.998963)  
10 x 1000000 x 10 6.614442 0.312002 6.926444 ( 6.930307)  
1 x 10000000 x 1 6.333641 0.124801 6.458441 ( 6.493261)

require ‘benchmark’

File.delete(“big.txt”) rescue 0  
File.delete(“big\_lines.txt”) rescue 0

Benchmark.bm do |x|  
puts “write big.txt”  
x.report {  
File.open(“big.txt”, “wb”) { |f|  
10\_000\_000.times { f.write(‘x’) }  
}  
}

puts “write big\_lines.txt”  
x.report {  
File.open(“big\_lines.txt”, “wb”) { |f|  
2.times {  
1\_000.times { f.write(‘x’ \* 1000 + “\r\n”) }  
1\_000.times { f.write(‘x’ \* 1000 + “\r”) }  
1\_000.times { f.write(‘x’ \* 1000 + “\r\n”) }  
1\_000.times { f.write(‘x’ \* 1000 + “\n”) }  
1\_000.times { f.write(‘x’ \* 1000 + “\r\n”) }  
}  
}  
}

[“big.txt”, “big\_lines.txt”].each do |file|  
puts “read #{file}”

```
     [
          [100, 1, 10_000_000],
          [100, 10, 1_000_000],
          [100, 1_000, 10_000],
          [100, 10_000, 1_000],
          [10, 100_000, 100],
          [10, 1_000_000, 10],
          [1, 10_000_000, 1],
     ].each { |n, m, s|
            x.report("#{n} x #{m} x #{s}") {
                 File.open(file, "r") { |f|
                   n.times {
                       f.seek(0);
                       m.times {
                         f.read(s)
                       }
                   }
                 }
            }
     }

```

end  
end

---

<div class="post-metadata">

**Author:** ![grujildo](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/94ad74/32.png) [@grujildo](https://www.ruby-forum.com/u/grujildo)\
**Post date:** [May 7, 2009, 3:46am UTC](https://www.ruby-forum.com/t/code-review-files3/167366/2 "2009-05-07T03:46:58Z")

</div>

F\*\*\*\*\* awesome!!! (damn MS curse filter, I need to express my emotions  
here!). Thanks Tomas! This will improve Rails perf also =)
