Christian Kruse: Ersetzen

Beitrag lesen

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);

testdaten generieren; einen array, in dem

jeweils 3-Buchstaben-Haeppchen sind

und einen langen String, an den jeweils auch

3-Buchstaben-Haeppchen angehaengt werden,

so dass letztenendes beide Beispiele diegleichen

Daten haben.

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;
    }
   });

eof

Gruss,
 CK