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

Oliver Bandel oliver at first.in-berlin.de
Di Aug 22 07:45:54 CEST 2006


On Tue, Aug 22, 2006 at 01:20:15AM +0200, Volker Grabsch wrote:
> On Mon, Aug 21, 2006 at 03:46:59PM +0200, Oliver Bandel wrote:
> > Mit OCaml nochmal probiert (etwas anderer Ansatz, aber das sei jetzt mal nebensächlich),
> > da kam ich auf ähnliche Zeiten, wie Perl (Bytecode etwas langsamer als Perl,
> > native Code etwas schneller als Perl).
> 
> Kannst du den Code mal posten?
> 

Nicht sehr schöner Code ;-)

Habe da keine Regexps genommen, weil ich dachte, es geht
mit String-Vrgleichen besser.



> Außerdem, was heißt hier "anderer Ansatz"?

String-Vergleiche irekt statt mit regexp's;
aber das ist in der C-Version ja auch so.
Da hab ich keine regexp-Lib genommen,
sondern nur das übliche was C mit bringt.



> Für einen fairen Vergleich
> solltest du auch in Ocaml zunächst zeilenweise lesen und dann jede
> Zeile auf den Beginn von "begin" überprüfen. Nach Möglichkeit alles
> über Funktionen der System-Library.

Es gibt da auch eine Regexp-Lib in der Distri, die hätte ich ebenfalls nutzen
können, habe ich aber nicht. (Oder ext. Lib: Perlre-Lib, aber ixh habe
ja auch bei C und Ruby nur das genommen, was "on board" war; und das
macht IMHO Sinn).



> (oder kann man in Ocaml nur byte-für-byte lesen und muss alles andere
> selbst bauen?)

Nö.

Hier der Code:

====================================================
exception Ready


let check_begin channel =
  let keyword = "begin" in
  let kwlen = String.length keyword in
  while true do
    let line = input_line channel in
      if(String.length line >= kwlen)
      then begin
             if (String.sub line 0 kwlen = keyword)
             then (print_endline line; raise End_of_file)
           end
  done


let args() = List.tl (Array.to_list Sys.argv) 

let  _ = List.iter
           (fun fn -> let ch = open_in fn in
                      try check_begin ch with End_of_file ->();
                      close_in ch) (args())
====================================================

Da seh' ich gerade, daß ich ja eigentlich Ready statt End_of_file
werfen wollte als exception; naja, End_of_file geht auch,
aber ich habe die falsche Bezeichnung gewählt; Ready wäre inhaltlich
richtiger.

Statt der ganzen Zeilen mit den String-Vergleichen hätte man
also auch Regexp's nehmen können - das meinte ich mit "anderem Ansatz".
Regexps werden wohl langsamer als String-Compares sein? (Oder ist es
bei simplen Patterns fast gleich?!) Aber das hätte hier dann noch ein
paar Zeilen gespart.

Nimmt man die exception (raise End_of_file) heraus, dann
werden alle Files bis zum Ende gelesen.


Gruß,
   Oliver



Mehr Informationen über die Mailingliste linux-l