Erik: Ersetzen

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

  1. 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

    1. 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

      1. 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

        1. 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