[Ironruby-core] Code Review: Files3

Jimmy Schementi Jimmy.Schementi at microsoft.com
Wed May 6 21:33:15 EDT 2009


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

> -----Original Message-----
> From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-
> bounces at rubyforge.org] On Behalf Of Tomas Matousek
> Sent: Wednesday, May 06, 2009 5:16 PM
> To: ironruby-core at rubyforge.org
> Subject: [Ironruby-core] Code Review: Files3
>
> 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
>
>



More information about the Ironruby-core mailing list