Ankündigung

Einklappen
Keine Ankündigung bisher.

Geschwindigkeitsoptimierung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Geschwindigkeitsoptimierung

    Hallo,

    um auch mit größeren Zahlen rechnen zu können, habe ich ein paar Funktionen geschrieben:
    PHP-Code:
    function get($in,$pos){
    $out=substr($in, -$pos1);
    return 
    intval($out);
    }


    //addieren
    function add($a,$b){
    $c="";
    $u=0;
    $max[0]=strlen($a);
    $max[1]=strlen($b);
    $max=max($max);
    for(
    $i=1;$i<=$max;$i++){
    $d=get($a,$i)+get($b,$i)+$u;
    $u=0;
    if(
    $d>9){$d=$d-10;$u=1;}
    $c=$d.$c;
    }
    if(
    $u){$c=$u.$c;}
    return 
    $c;
    }


    //multipliziert a mit b, durch b* addieren von a
    function mul2($a,$b){
    $c="";
    for(
    $i=1;$i<=$b;$i++){
    $c=add($c,$a);
    }
    return 
    $c;
    }

    //multipliziert a mit b
    function mul($a,$b){
    $c="";
    for(
    $i=strlen($b);$i>=1;$i--){
    $e="";
    for(
    $j=0;$j<($i-1);$j++){$e=$e."0";}

    $d=mul2($a,get($b,$i)).$e;
    $c=add($d,$c);
    }
    return 
    $c;


    Diese Funktionen sind leider etwas langsam. Deswegen wollte ich von euch wissen, ob man da etwas optimieren kann.

    Peter

  • #2
    Hallo,

    zumindest könntest du den Code mal ordentlich formatieren, dann kann man vielleicht auch etwas dazu sagen.

    Gruß
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Rechenoperatoren wie $a + $b sind die aber ein Begriff?
      "Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".

      Kommentar


      • #4
        Btw. kannst du dafür wohl besser auf die BC Math - Funktionen zurückgreifen: PHP: BC Math - Manual
        [URL]http://hallophp.de[/URL]

        Kommentar


        • #5
          Plus und Mal sind doch Pillepalle..
          [COLOR="#F5F5FF"]--[/COLOR]
          [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
          [COLOR="#F5F5FF"]
          --[/COLOR]

          Kommentar


          • #6
            Zitat von Dark Guardian Beitrag anzeigen
            Rechenoperatoren wie $a + $b sind die aber ein Begriff?
            ja, geht aber mit 1000-stelligen zahlen nicht mehr.

            Kommentar


            • #7
              Gegen sprechende Variablen ist nichts einzuwenden. Code nicht schneller, nur weil er möglichst kompakt geschrieben wird..

              Kommentar


              • #8
                Benutze dafür am Besten BCMath oder GMP wenn du wirklich optimierte Rechenoperationen haben möchtest!

                Ansonsten gibt es genug optimierte Algorithmen zur Multiplikation, für den Fall dass du das wirklich selbst schreiben willst! Stichwort: Karatsuba!

                Kommentar


                • #9
                  Für größere Berechnungen eigenen sich Lösungen in C++ viel mehr, da hier die Berechnung in einem Bruchteil der Zeit erfolgen

                  Ja ich weiß, der Topic hilft nicht weiter, aber ich kann dir auch nicht sagen, was du da noch optimieren kannst.

                  Kommentar


                  • #10
                    Für größere Berechnungen eigenen sich Lösungen in C++ viel mehr, da hier die Berechnung in einem Bruchteil der Zeit erfolgen

                    Ja ich weiß, der Topic hilft nicht weiter, aber ich kann dir auch nicht sagen, was du da noch optimieren kannst.
                    das ist meiner ansicht nach eine echt gute idee, ich weiß jetzt nicht mehr genau, wie dieses Program heißt, aber es gibt eines, mit dem man PHP nach c# oder c++, oder was auch immer übersetzten kannst. oder du gehst einfach her und ladest eine exe auf deinen server zum rechnen ... und nutzt den rückgabeparameter als ergebnis ...
                    PHP-Code:
                    if ( $humans >= ) {
                       
                    war ();

                    Kommentar


                    • #11
                      Zitat von PhillKill12 Beitrag anzeigen
                      [...] mit dem man PHP nach c# oder c++, oder was auch immer übersetzten kannst.
                      hiphop von facebook


                      sorry für OT, aber: hat damit schon jemand Erfahrung gemacht?


                      Danke & Gruss

                      Kommentar


                      • #12
                        sorry für OT, aber: hat damit schon jemand Erfahrung gemacht?
                        Nein, aber HipHop wird dieses Problem auch nicht lösen können, bzw. den PHP-Ansatz wesentlich schneller machen, weil der byteweise Zugriff in einer Schleife auch in "hochoptimiertem" Doppeltplus-C nicht besonders schnell ist.

                        Zitat von hman13 Beitrag anzeigen
                        Hallo,

                        um auch mit größeren Zahlen rechnen zu können, habe ich ein paar Funktionen geschrieben:
                        PHP-Code:
                        function get($in,$pos){
                        $out=substr($in, -$pos1);
                        return 
                        intval($out);
                        }


                        //addieren
                        function add($a,$b){
                        $c="";
                        $u=0;
                        $max[0]=strlen($a);
                        $max[1]=strlen($b);
                        $max=max($max);
                        for(
                        $i=1;$i<=$max;$i++){
                        $d=get($a,$i)+get($b,$i)+$u;
                        $u=0;
                        if(
                        $d>9){$d=$d-10;$u=1;}
                        $c=$d.$c;
                        }
                        if(
                        $u){$c=$u.$c;}
                        return 
                        $c;
                        }


                        //multipliziert a mit b, durch b* addieren von a
                        function mul2($a,$b){
                        $c="";
                        for(
                        $i=1;$i<=$b;$i++){
                        $c=add($c,$a);
                        }
                        return 
                        $c;
                        }

                        //multipliziert a mit b
                        function mul($a,$b){
                        $c="";
                        for(
                        $i=strlen($b);$i>=1;$i--){
                        $e="";
                        for(
                        $j=0;$j<($i-1);$j++){$e=$e."0";}

                        $d=mul2($a,get($b,$i)).$e;
                        $c=add($d,$c);
                        }
                        return 
                        $c;


                        Diese Funktionen sind leider etwas langsam. Deswegen wollte ich von euch wissen, ob man da etwas optimieren kann.
                        Anstatt jede Ziffer einzeln zu addieren oder zu subtrahieren, kannst du auch mehrere Stellen gemeinsam berechnen. 32-bittiges PHP kann mit Ganzzahlen im Dezimalbereich bis bis zu plus/minus einer Milliarde umgehen. Mit Floats könntest du sogar bis +/-1_000_000_000_000_000 (== eine Billiarde, nächstkleinere Zehnerpotenz vor 2 hoch 51) rechnen. Überträge sind mit einberechnet, führen also nicht zu einem Zahlenüberlauf.

                        Bei der Multiplikation wird es schwieriger. Aber auch hier könnte man etwas konstruieren, was wahrscheinlich schneller läuft als dein Ansatz. Der Trick besteht wieder im Zerlegen, diesmal der Faktoren:
                        (a + b) x (c + d) = ac + ad + bc + bd
                        Da die Produkte ac, ad usw. wiederum nicht die in PHP maximal mögliche Ganz- oder Real-Zahl überschreiten dürfen, sind hier die Stellenanzahlen begrenzt (stärker als bei der Addition):
                        Integer (Ganzzahlen): 10_000 (< 65536)
                        Real (Gleitkommazahlen): 10_000_000 (< 2 hoch 25)

                        Du könntest dir die Teilbereiche mit substr() ausschneiden, mit intval()|floatval() oder durch explizites Casting mit (int) oder (float) in Ganz- oder Realzahlen umwandeln und mit diesen Werten dann die Teilberechnungen durchführen. Die Ergebnisse der Teilberechnungen (Überträge nicht vergessen) müssen dann wieder in Strings umgewandelt werden, um sie am Ende wieder zusammenkleben zu können.
                        Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                        Kommentar

                        Lädt...
                        X