[linux-l] Ruby: sehr cool, aber auch sehr laaaahm... wie geht's schneller?!

Oliver Bandel oliver at first.in-berlin.de
Mo Aug 21 13:48:18 CEST 2006


Hallo,


seit kurzem schaue ich mir Ruby an.

Echt coole Sprache.
Da kann man sich das mit dem OO ja doch wieder angewöhnen ;-)

Leider ist die Sprache wohl etwas langsam, aber
OK wäre es, wenn die für die meisten Scripting-Sachen
schnell genug ist. Sollte meist reichen.

Aber wenn es langsamer (oder jedenfalls nicht schneller) wird,
obwohl es schneller werden sollte, wundert man sich doch. :(

Naja gut, am Wochenende habe ich erstmals geRuby't. Werden
sicherlich noch ein paar Kniffe da sein, die ich zu lernen habe
(was aber sicherlich recht flott geht).

Als erste Experimente wollte ich große Files checken, ob sie
/^begin/ enthalten, um zu checken, ob sie uuencodete Daten
beinhalten.


Folgende Lösung hatte ich mir einfallen lassen:


================================================
def look_for_begin
  while line = gets
    if line =~ /^begin/
      puts line
    end
  end
end


ARGF.each { look_for_begin }
================================================

Dauert mit den Files, die ich habe ziemlich lange,
ca. 3,6 Sekunden.

Nun dachte ich, mache ich das schneller, indem ich abbreche
nachdem der String gefunden wurde:



================================================
def look_for_begin
  catch :ready do
    while line = gets
      if line =~ /^begin/
        puts line
        throw :ready
      end
    end
  end
end

ARGF.each { look_for_begin }

================================================

Das wird aber auch nicht schneller.... sollte es aber,
denn die Datei dürfte ja nach dem throw nicht mehr zuende gelesen
werden müssen. Allerdings sagen mir die Ausführungszeiten, daß
anscheinend doch alle Files bis zum bitteren Ende gelesen werden...?!

Habe ich hier was übersehen (Anfänger-Glück ;-)) oder ist das
wirklich seltsam (soll ich das B-Wort sagen? Nee, ich warte erst mal
auf Antwort;-)) ?!


Perl-Version zum Vergleich:
---------------------------


========================================
  foreach (@ARGV)
  {
    open FILE, "$_"  or next;
    while(<FILE>)
    {
      if( /^begin/ )
      {
        print;
        #close FILE;
        #next;
      }
    }
    close FILE;
  }
========================================

ca. 1,7 Sekunden mit den Kommentaren,
ca. 0,8 Sekunden wenn man die Kommentarzeichen entfernt

So etwas (speedup) hätte ich bei meinen Ruby-Lösungen auch erwartet.


Wie geht das nun in Ruby?


Gruß,
   Oliver



Mehr Informationen über die Mailingliste linux-l