Tom: Perl - Geschwindigkeit von Berechnungen

Hallo!

Eine Frage an die Perl-Profis:

Ich möchte eine Funktion, die eine Zahl, die bei einen bestimmten Wert überschreitet, wieder von 0 weiterzählen lässt
$a und $num sind fix, $c wird bei jedem Schleifendurchlauf um 1 erhöht.

a)  $a+$c < $num ? $a+$c : $a+$c-$num

b)  ($a+$c) % $num

beides ergibt das selbe, die Frage ist, was ist schneller?
Denn das Ding ist bestandteil einer Sortierfunktion, und muss somit zig 1000 mal ausgeführt werden.

  1. Hallo!

    Eine Frage an die Perl-Profis:

    Ich möchte eine Funktion, die eine Zahl, die bei einen bestimmten Wert überschreitet, wieder von 0 weiterzählen lässt
    $a und $num sind fix, $c wird bei jedem Schleifendurchlauf um 1 erhöht.

    a)  $a+$c < $num ? $a+$c : $a+$c-$num

    b)  ($a+$c) % $num

    Ich vermute b), aber am einfachsten mach zum Test ein Schleife rum. z.B. 2000 mal durchlaufen und dabei die Zeit messen.

    Ciao Micha

    beides ergibt das selbe, die Frage ist, was ist schneller?
    Denn das Ding ist bestandteil einer Sortierfunktion, und muss somit zig 1000 mal ausgeführt werden.

  2. $a = 1;
    $c = 1;
    $num = 25;

    $zeit1 = time();
    for( $i = 1 ; $i <= 1000000 ; $i++ )
    {
       ($a + $c) % $num;
       $c++;
    }
    $zeit2 = time();

    print "sekunden: " . ( $zeit2 - $zeit1 ) . "\n" ;

    $a = 1;
    $c = 1;
    $num = 25;

    $zeit1 = time();
    for( $i = 1 ; $i <= 1000000 ; $i++ )
    {
       $a + $c < $num ? $a + $c : $a + $c - $num;
       $c++;
    }
    $zeit2 = time();

    print "sekunden: " . ( $zeit2 - $zeit1 ) . "\n";

    Und b) ist deutlich schneller (fast dobbelt).

    Hallo!

    Eine Frage an die Perl-Profis:

    Ich möchte eine Funktion, die eine Zahl, die bei einen bestimmten Wert überschreitet, wieder von 0 weiterzählen lässt
    $a und $num sind fix, $c wird bei jedem Schleifendurchlauf um 1 erhöht.

    a)  $a+$c < $num ? $a+$c : $a+$c-$num

    b)  ($a+$c) % $num

    beides ergibt das selbe, die Frage ist, was ist schneller?
    Denn das Ding ist bestandteil einer Sortierfunktion, und muss somit zig 1000 mal ausgeführt werden.

    1. Und b) ist deutlich schneller (fast dobbelt).

      Danke Sehr!!

      Ich hab nämlich gerade ein Script für die Burrows-Wheeler-Transformation geschrieben, und das braucht schon bei einem 16kb-file ne knappe minute zu codieren, ich kann also jedes bisschen speed gebrauchen.

      1. Und b) ist deutlich schneller (fast dobbelt).

        Danke Sehr!!

        Ich hab nämlich gerade ein Script für die Burrows-Wheeler-Transformation geschrieben, und das braucht schon bei einem 16kb-file ne knappe minute zu codieren, ich kann also jedes bisschen speed gebrauchen.

        Das war doch ein Komprimierungsverfahren, geht das nicht deutlich schneller in C.

        Oder was machst Du genau?

        Ciao Micha

        1. Das war doch ein Komprimierungsverfahren, geht das nicht deutlich schneller in C.

          Oder was machst Du genau?

          Ciao Micha

          Nun, es ist nicht wirklich ein Komprimierungsverfahren, sondern es optimiert Daten für Komprimierung ;-)

          Mir ist schon bewusst dass es in C schneller geht, aber wo bleibt dann der Spass :-)

          Es gibt einen Haufen open-source programme, die das können, aber vom kopieren lernt man nichts, und es ging mir mehr darum, ob ich das Prinzip von BWT selber mit Perl realisieren kann, als jetzt ein neues zip-proggi zu entwickeln.

          Adios!

  3. Hi!

    Ich möchte eine Funktion, die eine Zahl, die bei einen bestimmten Wert überschreitet, wieder von 0 weiterzählen lässt
    $a und $num sind fix, $c wird bei jedem Schleifendurchlauf um 1 erhöht.

    Demnach wird also das, was Du hier berechnest, an $c zugewiesen, oder?

    a)  $a+$c < $num ? $a+$c : $a+$c-$num
    b)  ($a+$c) % $num

    Beides ist fuer das Problem, dass Du vorgetragen hast, ziemlich sinnlos. Am schnellsten waere sicherlich

    $c = 0 if ($a + $c >= $num);

    Willst Du wirklich wissen, welche von Deinen beiden Varianten schneller ist, so ist das schwer von der Hardware abhaengig, auf der das laeuft.

    So long

    1. Hallo,

      $c = 0 if ($a + $c >= $num);

      und wenn vor der Schleife
      $wasauchimmer =$num-$a;
      gesetzt wird und in der Schleife
      $c = 0 if $c>= $wasauchimmer;

      gemacht wird, wird es sicher noch hurtiger;-)

      Willst Du wirklich wissen, welche von Deinen beiden Varianten schneller ist, so ist das schwer von der Hardware abhaengig, auf der das laeuft.

      IMHO kann nur b) gewinnen, da Addition + Modulo sicherlich schneller ist als Addition + Vergleich + (Addition|Addition+Subtraktion).

      Grüße
        Klaus

      1. Hallo

        Danke für die vielen antworten

        $wasauchimmer =$num-$a;
        gesetzt wird und in der Schleife
        $c = 0 if $c>= $wasauchimmer;

        hmm, ich bin mir nicht sicher ob das insgesamt dann schneller ist, mal testen.

        1. Hallo

          Hier der gesamte Code der Sort funktion
          @letterbox ist ein array, der die einzelnen Buchstaben des Inputs enthält, $num die Länge davon.
          $c = 0 if ($a+$c > $num)  kommt mit der last-abfrage ins gehegen, ist aber nicht unlösbar. (aber der Vorteil geht zumindest teilweise verloren)
          $wasauchimmer =$num-$a; ist nicht nur vorteilhaft, da die Funktion, in der die Schleife sich befindet, noch viel öfter ausgeführt wird.

          @new = sort bwtsort 0..($num-1);
          sub bwtsort {
          my $x = $letterbox[$a];
          my $y = $letterbox[$b];
          my $c = 1;
          while ($x eq $y) {
          $x .= $letterbox[($a+$c)%$num];
          $y .= $letterbox[($b+$c)%$num];
          $c++;
          last if ($c>$num);
          }
          return ($x cmp $y)
          }

      2. Hi Klaus!

        und wenn vor der Schleife
        $wasauchimmer =$num-$a;
        gesetzt wird und in der Schleife
        $c = 0 if $c>= $wasauchimmer;
        gemacht wird, wird es sicher noch hurtiger;-)

        Yoh, stimmt.

        IMHO kann nur b) gewinnen, da Addition + Modulo sicherlich schneller ist als Addition + Vergleich + (Addition|Addition+Subtraktion).

        Nun, eine Division dauert auf manchen Hardwaren wirklich verdammt lange, sodass die die Zeitdauer der Alternative durchaus mal auffressen kann. Wuerde Perl so weit optimieren, dass es das Ergebnis der Addition in a) in beiden Faellen wiederverwendet, wuerde das a) noch beguenstigen. Allerdings spielt noch der Overhead von Perl mit rein, wodurch die b-Variante natuerlich wieder gegenueber a) besser kommt. Dieselben Zeilen in C geschrieben koennten also andere Ergebnisse bringen.

        Michael: Fuer Deine Aussage "Was schneller ist haengt absolut nicht von der Hardware ab" wuerde mich eine Begruendung aber schon interessieren.

        So long

        1. Michael: Fuer Deine Aussage "Was schneller ist haengt absolut nicht von der Hardware ab" wuerde mich eine Begruendung aber schon interessieren.

          Okay, Perl ist kein reiner Interpreter. Perl kompiliert ein Script erst in ein Zwischencode bevor er es an den Interpreter weitergibt. Hierbei werden zwar schon verschiedene Optimierungen durchgefuehrt, mir ist aber bisher nicht bekannt, dass diese auf die Hardware optimiert wurden. Vielmehr solche Optimierungen wie Du oben genannt hattest.

          Bei dem Test von mir mit dem Script, spielt die Hardware IMHO keine Rolle, da es ja auf dem selben Rechner und Hardware ausgefuehrt wird, dadurch spielt in dem Script nur die ausgetauschte Zeile eine Rolle. Und die ist rein abhaengig von Effektivitaet des (Algorithmus).

          Klar ist, dass es wohl einen Unterschied macht, ob ich es hier auf der PC-Hardware laufen lasse oder auf unseren kleinen SUN an der Uni.

          Ciao Micha

          1. Hoi,

            Bei dem Test von mir mit dem Script, spielt die Hardware IMHO keine Rolle, da es ja auf dem
            selben Rechner und Hardware ausgefuehrt wird, dadurch spielt in dem Script nur die
            ausgetauschte Zeile eine Rolle. Und die ist rein abhaengig von Effektivitaet des (Algorithmus).

            Darum gehts doch gar nicht. Es geht darum, das einige Algorithmen auf anderen Platformen
            schneller/effektiver sind als auf anderen. Der Algorithmus, der auf einem PC mit Coprozessor super
            schnell laeuft, kann auf einem PC ohne Coproessor verdammt lahmarschig sein. Die verwendete
            Hardware spielt eine herausragende Rolle.

            Klar ist, dass es wohl einen Unterschied macht, ob ich es hier auf der PC-Hardware laufen
            lasse oder auf unseren kleinen SUN an der Uni.

            Ob dein PC oder der PC des Nachbarn kann schon einen Unterschied machen; schau dir mal
            die Benchmarks der aktuellen Intel- und AMD-Prozessoren an.

            Gruesse,
             CK

            1. Hoi,

              Moin

              Bei dem Test von mir mit dem Script, spielt die Hardware IMHO keine Rolle, da es ja auf dem
              selben Rechner und Hardware ausgefuehrt wird, dadurch spielt in dem Script nur die
              ausgetauschte Zeile eine Rolle. Und die ist rein abhaengig von Effektivitaet des (Algorithmus).

              Darum gehts doch gar nicht. Es geht darum, das einige Algorithmen auf anderen Platformen
              schneller/effektiver sind als auf anderen. Der Algorithmus, der auf einem PC mit Coprozessor super
              schnell laeuft, kann auf einem PC ohne Coproessor verdammt lahmarschig sein. Die verwendete
              Hardware spielt eine herausragende Rolle.

              Darum geht es schon, denn Tom sucht eine schnellere Variantie fuer seine Sourcezeile und da nuetzt es ihm ueberhaupt nix, wenn er auf einen anderen Rechner wechseln soll/muss.
              Es geht hier rein um die Performance des Sources.

              Klar ist, dass es wohl einen Unterschied macht, ob ich es hier auf der PC-Hardware laufen
              lasse oder auf unseren kleinen SUN an der Uni.

              Ob dein PC oder der PC des Nachbarn kann schon einen Unterschied machen; schau dir mal
              die Benchmarks der aktuellen Intel- und AMD-Prozessoren an.

              Hallo, genau lesen.

              Gruesse,
              CK

              Ciao Micha

              1. Hoi,

                Bei dem Test von mir mit dem Script, spielt die Hardware IMHO keine Rolle, da es ja auf dem
                selben Rechner und Hardware ausgefuehrt wird, dadurch spielt in dem Script nur die
                ausgetauschte Zeile eine Rolle. Und die ist rein abhaengig von Effektivitaet des (Algorithmus).

                Darum gehts doch gar nicht. Es geht darum, das einige Algorithmen auf anderen Platformen
                schneller/effektiver sind als auf anderen. Der Algorithmus, der auf einem PC mit Coprozessor super
                schnell laeuft, kann auf einem PC ohne Coproessor verdammt lahmarschig sein. Die verwendete
                Hardware spielt eine herausragende Rolle.

                Darum geht es schon, denn Tom sucht eine schnellere Variantie fuer seine Sourcezeile und
                da nuetzt es ihm ueberhaupt nix, wenn er auf einen anderen Rechner wechseln soll/muss.
                Es geht hier rein um die Performance des Sources.

                Eben! Und die ist sehr stark abhaengig von der verwendeten Plattformarchitektur, vom OS und
                noch einigen anderen Dingen. Wie gesagt, ein Algorithmus, der sehr performant ist,
                kann auf einer anderen Plattform schon ganz anders laufen. Es gibt keine plattformuabhaengige
                Optimierung! Man kann einen Algorithmus nur sehr, sehr eingeschraenkt optimieren, wenn
                man weder Plattform, noch OS, noch sonstwas kennt: naemlich nur in soweit, als dass man
                annimmt, dass das, was man bei der eigenen Plattform festgestellt hat, auch fuer die andere
                gilt. Deshalb sind Benchmarks auch nicht aussagekraeftig ohne Angabe von Plattform, OS und
                Compiler.

                Klar ist, dass es wohl einen Unterschied macht, ob ich es hier auf der PC-Hardware
                laufen lasse oder auf unseren kleinen SUN an der Uni.

                Ob dein PC oder der PC des Nachbarn kann schon einen Unterschied machen; schau
                dir mal die Benchmarks der aktuellen Intel- und AMD-Prozessoren an.

                Hallo, genau lesen.

                Dito.

                Gruesse,
                 CK

                1. Hallo, snipp ...

                  Eben! Und die ist sehr stark abhaengig von der verwendeten Plattformarchitektur, vom OS und
                  noch einigen anderen Dingen. Wie gesagt, ein Algorithmus, der sehr performant ist,
                  kann auf einer anderen Plattform schon ganz anders laufen. Es gibt keine plattformuabhaengige
                  Optimierung! Man kann einen Algorithmus nur sehr, sehr eingeschraenkt optimieren, wenn
                  man weder Plattform, noch OS, noch sonstwas kennt: naemlich nur in soweit, als dass man
                  annimmt, dass das, was man bei der eigenen Plattform festgestellt hat, auch fuer die andere
                  gilt. Deshalb sind Benchmarks auch nicht aussagekraeftig ohne Angabe von Plattform, OS und
                  Compiler.

                  Ich wuerde aber behaupten, dass bei unserem Problem (Perl) die Plattform
                  (fast) vernachlaessigbar ist. b) war deutlich schneller als a) und ich
                  meine das sich das auch nicht auf anderen Plattformen aendert,
                  z.B. (Unix, Linux, Sun, DOS keine Aenderung). Die Zeit aendert sich schon,
                  aber b) ist immer deutlich schneller und das wird sich auch IMHO nicht
                  aendern.

                  Bye Micha

                  1. Hoi,

                    Ich wuerde aber behaupten, dass bei unserem Problem (Perl) die Plattform
                    (fast) vernachlaessigbar ist.

                    Wenn du mit "fast vernachlaessigbar" die Architekturen ohne FPU ausschliesst,
                    stimme ich dir zu.

                    Gruesse,
                     CK

    2. $c = 0 if ($a + $c >= $num);

      Willst Du wirklich wissen, welche von Deinen beiden Varianten schneller ist, so ist das schwer von der Hardware abhaengig, auf der das laeuft.

      Was schneller ist haengt absolut nicht von der Hardware ab. Auf einem Rechner laufen die drei Arten je nach Effizients ab, d.h. man kann wirklich sehen was besser ist:

      a) 19 Sekunden
      b) 11 Sekunden
      Dein) 10 Sekunden

      Vielleicht geht es ja noch besser.

      Ciao Micha

      So long