On Nov 28, 4:24 am, Antonio Cangiano <acangi... / gmail.com> wrote:
> I ran a micro-benchmark with Ruby 1.8.6, Ruby 1.9 and Python 2.5.1,
> and was stunned by Ruby 1.9's improvements. Incidentally for my
> particular test (which is a silly one...), Ruby was more than twice as
> fast as Python!
>
> http://antoniocangiano.com/2007/11/28/holy-shmoly-ruby-19-smokes-pyth...
>
> We can't say for sure yet, but chances are that Ruby 1.9 is going to
> be faster than CPython in most situations, which would be a great
> accomplishment and step forward for the Ruby community. It's not a
> competition, but a speed boost of this caliber is super welcomed. :-)
>
> Cheers,
> Antonio

I'm also pleased to see how well 1.9 is advancing. :) But it is still
possible to be faster. Here's another silly micro-benchmark...

==== bench.rb ====
require 'benchmark'

def test(n)
  n.times {
    h = Hash.new
    a = %w{a b c d e f g h i j k l m n
           o p q r s t u v w x y z}
    a.each { |l| h[l] = l.upcase }
    p = []
    h.each { |k,v|   p << [k, v]  }
    p.each { |p1,p2| h.delete(p1) }
  }
end

Benchmark.bm { | x |
  x.report { test(100000) }
}
==================

==== bench.py ====
from cProfile import run

def test(n):
  for i in xrange(n):
    h = dict()
    a = 'a b c d e f g h i j k l m n ' \
        'o p q r s t u v w x y z'
    for l in a.split():
      h[l] = l.upper()
    p = []
    for k, v in h.items():
      p.append([k, v])
    for p1, p2 in p:
      del h[p1]

run('test(100000)')
==================

Results:

$ ruby -v && ruby bench.rb
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux]
      user     system      total        real
 24.340000   1.920000  26.260000 ( 28.686532)

$ ruby19 -v && ruby19 bench.rb
ruby 1.9.0 (2007-10-15 patchlevel 0) [i686-linux]
      user     system      total        real
 17.570000   0.050000  17.620000 ( 19.293883)

$ python -V && python bench.py
Python 2.5.1
         5400003 function calls in 14.798 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall
filename:lineno(function)
        1    0.000    0.000   14.798   14.798 <string>:1(<module>)
        1   11.015   11.015   14.798   14.798 bench.py:3(test)
  2600000    1.447    0.000    1.447    0.000 {method 'append' of
'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of
'_lsprof.Profiler' objects}
   100000    0.279    0.000    0.279    0.000 {method 'items' of
'dict' objects}
   100000    0.509    0.000    0.509    0.000 {method 'split' of 'str'
objects}
  2600000    1.548    0.000    1.548    0.000 {method 'upper' of 'str'
objects}

So 1.8.6 comes it at 28.686532 seconds.
Version 1.9 shows a 33% improvement at 19.293883.
But python still takes the cake at 14.798 (49% improvement).

But like others have said, people don't use ruby because it's the
fastest language in the world. A beautiful person may be stupid, and a
smart person may be ugly; but no one ever asked to paint a portrait of
an ugly person, no matter how smart they were. ;) Still, the fact that
current ruby 1.9 performed within 16% of python in this bechmark is
nice.

Regards,
Jordan