In Perl 5 können Sie wc -l
mit Oneliner emulieren :
perl -lnE 'END {say $.}' test.txt
So implementieren Sie diese Funktionalität auf Raku
Wenn Sie versuchen, dies zu implementieren:
raku -e 'say "test.txt".IO.open.lines.elems'
es stellt sich als langsam heraus und verbraucht viel Speicher
Informationen zur Reproduktion:
$ wget http://eforexcel.com/wp/wp-content/uploads/2017/07/1500000%20Sales%20Records.zip
$ unzip "1500000 Sales Records.zip"
$ mv "1500000 Sales Records.csv" part.txt
$ for i in `seq 1 10`; do cat part.txt >> test.txt ; done
$ du -sh test.txt
1.8G test.txt
$ time wc -l test.txt
15000000 test.txt
real 0m0,350s
user 0m0,143s
sys 0m0,205s
$ time perl -lnE 'END { say $. }' test.txt
15000001
real 0m1,981s
user 0m1,719s
sys 0m0,256s
$ time raku -e 'say "test.txt".IO.open.lines.elems'
15000001
real 2m51,852s
user 0m25,129s
sys 0m6,378s
# Using swap (maximum uses 2.2G swap):
# Before `raku -e ''`
$ free -m
total used free shared buff/cache available
Mem: 15009 1695 12604 107 708 12917
Swap: 7583 0 7583
# After `raku -e ''`
$ free -m
total used free shared buff/cache available
Mem: 15009 752 13923 72 332 13899
Swap: 7583 779 6804
# Swap not used
$ time raku -ne '++$ andthen END .say' test.txt
15000001
real 1m44,906s
user 2m14,165s
sys 0m0,653s
$ raku -v
This is Rakudo version 2019.11 built on MoarVM version 2019.11
implementing Perl 6.d.
wc
(die Dateigröße enthalten sollte) hinzufügen . Vielen Dank.raku
), wäre es immer noch gut, eineraku -v
Ausgabe zu haben . Bitte denken Sie auch daran, die Ausgabe des Timings meines aktuellen Vorschlags hinzuzufügen. Vielleicht werde ich'ascii'
später am Wochenende auf den Decoder umsteigen, um eine bessere Zeit zu erzielen.-l
Nebenbei bemerkt: Das Flag für Perl verlangsamt das Perl erheblich und ist in diesem Fall nicht nützlich. Auf meinem Computer für eine Datei mit zufälliger Zeilenlänge und etwa 200.000 Zeilen führt das Entfernen-l
zu einer 40% igen Verbesserung.Antworten:
Eine Option, die
perl
im Vergleich zu wahrscheinlich immer noch ziemlich langsam ist, aber einen Vergleich wert:Die
l
Befehlszeilenoption ist redundant.$
ist ein anonymer Staatsskalar.andthen
testet, ob sein lhs definiert ist, und setzt in diesem Fall diesen Wert als topic ($_
) und wertet dann sein rhs aus.END
ist ähnlich wieperl
'sEND
. Beachten Sie, dass es zum zurückkehrtNil
,andthen
aber das spielt hier keine Rolle, da wir dieEND
Anweisung von 'als Nebenwirkung verwenden.Verschiedene Dinge wirken sich auf die Geschwindigkeit dieses Codes aus. Einige Dinge, an die ich denken kann:
Compiler-Startaufwand. Ohne Berücksichtigung der verwendeten Module hat der
raku
Compiler Rakudo einen Startaufwand von etwa einer Zehntelsekunde auf typischer Hardware im Vergleich zu einem ziemlich vernachlässigbarenperl
.Der Begriff einer "Linie". In
perl
wird standardmäßig eine Reihe von Bytes gelesen, von denen einige ein Zeilenende darstellen. Inraku
wird standardmäßig eine UTF-8-Zeichenfolge gelesen, von der einige Zeilenenden darstellen. Somit entstehtperl
nur der Lese-Overhead eines ASCII- (oder Extended ASCII-) Decoders, währendraku
der Lese-Overhead eines UTF-8-Decoders anfällt.Compiler-Optimierungen.
perl
ist in der Regel auf die max optimiert. Es würde mich nicht überraschen, wenn ichperl -lnE 'END {say $.}' test.txt
einige clevere Optimierungen nutzen würde. Im Gegensatz dazu befindet sich die Arbeit an der Rakudo-Optimierung relativ gesehen noch in den Anfängen.Das einzige, was meiner Meinung nach jeder gegen den ersten und letzten der drei oben genannten Punkte tun kann, ist, N Jahre zu warten und / oder zur Verbesserung des Compilers beizutragen.
Es wird eine Möglichkeit geben, Rakus UTF-8 standardmäßig zu umgehen. Vielleicht ist so etwas wie das Folgende bereits machbar und deutlich schneller als Rakus Standard, wobei zumindest der Aufwand für die Verwendung eines Moduls namens
foo
:Dabei
foo
schaltet das Modul die Standardcodierung für Datei-E / A auf ASCII oder was auch immer aus den verfügbaren Codierungen um .Ich habe nicht überprüft, ob dies im aktuellen Rakudo tatsächlich machbar ist, wäre aber überrascht, wenn dies nicht der Fall wäre.
quelle