[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