Ersetzen
Erik
- perl
Hallo,
ich schreibe gerade ein Skript bei dem ich viel ersetzen muss. Jetzt meine Frage: ist es besser alle Ausgaben zu sammeln und dann alles auf einmal zu ersetzen oder alles einzeln zu ersetzen und auszugeben?
MfG
Erik
ich schreibe gerade ein Skript bei dem ich viel ersetzen muss. Jetzt meine Frage: ist es besser alle Ausgaben zu sammeln und dann alles auf einmal zu ersetzen oder alles einzeln zu ersetzen und auszugeben?
Hallo Erik
Bei Webanwendungen mit Ausgabe des Textes, ist es schneller, wenn du alles auf einmal ausgibst, dann muss der Webserver nicht alle Daten separat chachen, sondern kann ganze Blöcke verarbeiten. Das ist etwas schnellerer. Besonders, wenn die Funktion $¦=1 gesetzt ist, solltest du Textausgaben blockweise dem Webserver übergeben.
$¦=1 setzt das Caching ausser Betrieb. Es werden also viel mehr Daten übers Web versendet, was ziemlich viel Performance verbraucht.
Der low-level Performance-Anspruch (auf Maschinenebene) beim Ersetzen ist etwa der selbe. Gute Algorithmen sind jedoch etwas schneller bei kleinen Texten.
Fazit: Ich würde sagen, dass du vom Unterschied nichts merkst.
Testen kann man das mit Benchmarks. Es gibt ein Modul auf CPAN hierzu (ist auch auf den meisten Systemen vorinstalliert).
Hoffe, dass das etwas hilft
Philipp
Joho Philip,
Bei Webanwendungen mit Ausgabe des Textes, ist es schneller, wenn du alles
auf einmal ausgibst, dann muss der Webserver nicht alle Daten separat
chachen, sondern kann ganze Blöcke verarbeiten. Das ist etwas schnellerer.
Besonders, wenn die Funktion $¦=1 gesetzt ist, solltest du Textausgaben
blockweise dem Webserver übergeben.
Was bitte meinst du damit?
$¦=1 setzt das Caching ausser Betrieb. Es werden also viel mehr Daten übers
Web versendet, was ziemlich viel Performance verbraucht.
Ich glaube, du hast da was verwechselt. $| ist fuer die Ausgabepufferung, das
hat nichts mit Caching zu tun. Wenn du z. B. ein
print "a";
machst, dann kann es sein, dass die Ausgabe erst am Ende des Programmes
gemacht wird. Das kann bei $| = 1 nicht mehr gehen - der Puffer wird gelehrt.
Der low-level Performance-Anspruch (auf Maschinenebene) beim Ersetzen ist
etwa der selbe. Gute Algorithmen sind jedoch etwas schneller bei kleinen
Texten.
Der s///-Operator ist auf wenige grosse Texte schneller ist als auf viele
kleine.
Testen kann man das mit Benchmarks. Es gibt ein Modul auf CPAN hierzu (ist
auch auf den meisten Systemen vorinstalliert).
Das Modul heisst (natuerlich ;-) Benchmark.
Gruss,
CK
Bei Webanwendungen mit Ausgabe des Textes, ist es schneller, wenn du alles
auf einmal ausgibst, dann muss der Webserver nicht alle Daten separat
chachen, sondern kann ganze Blöcke verarbeiten. Das ist etwas schnellerer.
Besonders, wenn die Funktion $¦=1 gesetzt ist, solltest du Textausgaben
blockweise dem Webserver übergeben.
Was bitte meinst du damit?
Wenn $¦=1 nicht gesetzt ist, werden immer ganz grosse Datenblöcke versendet. Wenn $¦=1 ist, werden viele kleine Versendet, jeder Datenblock hat einen Header, der auch noch Platz verbraucht und somit das senden verlangsamt. => Wenn wenige grosse Blöcke übers web gesendet werden ist das schneller, als viele kleine!
$¦=1 setzt das Caching ausser Betrieb. Es werden also viel mehr Daten übers
Web versendet, was ziemlich viel Performance verbraucht.
Ich glaube, du hast da was verwechselt. $| ist fuer die Ausgabepufferung, das
hat nichts mit Caching zu tun. Wenn du z. B. ein
Ja, sorry, hab mich falsch ausgedrückt. Wahr wohl etwas müde gestern.
Der low-level Performance-Anspruch (auf Maschinenebene) beim Ersetzen ist
etwa der selbe. Gute Algorithmen sind jedoch etwas schneller bei kleinen
Texten.
Der s///-Operator ist auf wenige grosse Texte schneller ist als auf viele
kleine.
Faszinierend. Würde mir mal gerne den verantwortlichen Code ansehen. Ich habe zwar keine Tests durchgeführt, aber meiner Logik her, sollte das anders herum gehen.
Testen kann man das mit Benchmarks. Es gibt ein Modul auf CPAN hierzu (ist
auch auf den meisten Systemen vorinstalliert).
Das Modul heisst (natuerlich ;-) Benchmark.
Nicht wahr??? :-)
Gruss
Philipp
Joho, <-- das ist eine Begruessung
Was bitte meinst du damit?
Wenn $¦=1 nicht gesetzt ist, werden immer ganz grosse Datenblöcke
versendet. Wenn $¦=1 ist, werden viele kleine Versendet, jeder
Datenblock hat einen Header, der auch noch Platz verbraucht und
somit das senden verlangsamt. => Wenn wenige grosse Blöcke übers
web gesendet werden ist das schneller, als viele kleine!
Eigentlich gibt es bei TCP keine 'Daten-Pakete'. TCP ist ein
Streaming-Protokoll, das heisst, die Daten werden laufend aus einem
Puffer gesendet.
Der Apache arbeitet mit Sockets. Dieses Sockets stellen ein
Filehandle zur Verfuegung und hinter dem Filehandle steckt ein
FIFO-Puffer, will heissen, alles, was man da reinschreibt, wird
von vorn wieder ausgelesen.
Das letztenendes doch wieder Pakete verwendet werden, ist natuerlich
klar. Aber diese Paekte sind eigentlich immer gleich gross, sofern
der Datenzufluss bestaendig ist.
Anders arbeitet z. B. UDP. UDP ist ein Datagram-Protokoll, also
ein Paket-basiertes Protokoll.
Ja, sorry, hab mich falsch ausgedrückt. Wahr wohl etwas müde
gestern.
Frueher Schlafen gehen ;-)
Der low-level Performance-Anspruch (auf Maschinenebene) beim
Ersetzen ist etwa der selbe. Gute Algorithmen sind jedoch
etwas schneller bei kleinen Texten.
Der s///-Operator ist auf wenige grosse Texte schneller ist als
auf viele kleine.
Faszinierend. Würde mir mal gerne den verantwortlichen Code
ansehen. Ich habe zwar keine Tests durchgeführt, aber meiner
Logik her, sollte das anders herum gehen.
Im Gegenteil. Stell dir vor, du hast 10000 kleine Haeppchen, auf
die du immer denselben RegEx anwendest. Fuer jeden Durchgang muss
die RegEx-VM neu angeworfen werden. Ausserdem muss der
Schleifen-Overhead mit beruecksichtigt werden, so das am Ende
ein durchaus beeindruckendes Ergebnis herauskommt:
Benchmark: timing 10000 iterations of long, short...
long: 1 wallclock secs ( 1.21 usr + 0.00 sys = 1.21 CPU) @ 8257.64/s (n=10000)
short: 70 wallclock secs (68.62 usr + 0.00 sys = 68.62 CPU) @ 145.73/s (n=10000)
Der folgende Beispiel-Code wurde verwendet:
#!/usr/bin/perl -w
use strict;
use Benchmark;
my $data_long = '';
my @data_short = ();
my @buchstaben = qw(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 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(1..10000)
{
my $testdata = join '' => @buchstaben[rand 52,rand 52,rand 52,rand 52];
push @data_short,$testdata;
$data_long .= $testdata;
}
timethese(10000,{
long => sub {
$data_long =~ s/a/b/g;
},
short => sub {
s/a/b/ foreach @data_short;
}
});
Gruss,
CK