PHP-Script langsamer als C++ Programm ?



  • Hi,

    Ich muss jede Stunde 200.000 Datemsätzten in der Mysql Datenbank updaten.

    Ich hab das ganze erstmal in PHP geschrieben und musste leider festellen,

    dass 3.000 Datensätzte ca. 30 sec zum Updaten brauchen.

    Jetzt stell ich mir die Frage, ob das ganze in C++ schneller gehen kann ?

    Ich denke mal die Dauer der Querys sind genauso "langsam" wie bei PHP !

    Oder seh ich das falsch ?

    Bye



  • C++ ist unbestritten schneller, allerdings hängt die Geschwindigkeit beim Arbeiten mit Datenbanken nicht nur von der Sprache ab. Das Design ist wichtig, dementsprechend sieht ja dann auch die Query aus. Irgendwer hatte mal ne Query, die war 10 Zeilen lang und tausendmal verschachtelt. Das hätteste mit Assembler da einfügen können, es wäre kaum schneller gewesen :D. Kurzum, ich denke eine Pauschalantwort lässt sich so nicht geben, vermute aber auch, dass du keine lohnenswerten Geschwindigkeitsvorteile herausholen kannst. Zumal der Aufwand, das in C++ zu machen, doch etwas größer ist als in PHP......



  • PHP ist langsamer als C++ um auf MySQL zuzugreifen weil PHP erst geparsed weerden muss. Sonst ist es nicht langsamer da PHP unter der Haube auch die MySQL-API verwendet.

    Der Aufwand ist aber nicht unbedingt bei C++ großer. Ich habe z.B. eine C++-Klasse in der ich <= Aufwand habe wie bei PHP.

    Du hast vermutlich in deinem Design ein Problem da 200 000 Datensätze nichts sind.
    Kommt jetzt darauf an was du damit machst und wie du es machst.



  • Hi,

    Jo, hab das ganze jetzt mal mit der C++ Api gemacht. Anstatt 40 sec braucht mein script jetzt 0.5 sec 🙂

    Naja. Mein prob ist mom. dass ich keine gute Lösung habe, ein Feld mit "serializedem" inhalt gescheit in C++ auszulesen!

    Gibt es dafür schon vorgeschriebene funktionen ?

    Bye



  • Mich würd mal das SQL-Query interessieren....



  • Das Query ist bisher nix besonderes.
    Reines Testen. Es müssem alle Datenstäzte in einer tabelle geupdatet werden. Und das jede Stunde in einer guten Zeit <= 10 sec.

    q1 = "SELECT * FROM tabelle"
    while( q1 )
    {
         q2 = "UPDATE tabelle ** WHERE id='x'";
    }
    


  • Der Geschwindigkeitsunterschied ist schon enorm. Hätte ich nicht ansatzweise gedacht, zumal es ja eine 08/15 Abfrage ist. Naja, man lernt eben nie aus :D.



  • Hi,

    Hatte mich auch sehr gewundert!!

    Wenn ich mein anderen Problem nochwas zitieren darf ?

    Mein prob ist mom. dass ich keine gute Lösung habe, ein Feld mit "serializedem" inhalt gescheit in C++ auszulesen!

    Gibt es dafür schon vorgeschriebene funktionen ?

    Weiß da jemand vielleicht eine "gute" Lösung ?

    Bye



  • Zeig nochmal genau deine SQL-Querys. Ist werde aus dem gezeigten nicht schlau.
    Der Unterschied ist zu groß um das auf PHP zu schieben



  • Hi,
    Sieht genau so aus wie ich es gepostet habe, nur mit ein paar werten!

    Bye



  • Hmmm - php ist zwar deutlich langsamer als c++, aber bei einer so simplen Query macht das imo nicht so einen einen Unterschied(Die mysql Funktionen sind ja auch in C geschrieben).

    Einen so hohen performance Unterschied könnte ich mir bei komplexen Algorithmen vorstellen, aber nicht bei einer normalen Abfrage.

    Gruss



  • Normalerweise ist C++ nur deswegen schneller, weil man low-levliger arbeitet.

    Zum Beispiel werden Variabeln nicht automatisch mit 0 initialisiert, weil das ja auch nicht immer nötig ist.

    Aber einen großen Teil macht auch aus, dass C++ einfach mehr Möglichkeiten zur Optimierung bietet, weil man wirklich jede Kleinigkeit selber bestimmen kann und auf die Zehen optimieren kann.

    C++ ist nicht zwingend schneller, Bsp.:

    for(int i = 0; i < 1000000000; ++i);
    
    int var = 10;
    
    $var = 10;
    

    Was ist schneller? 🙂

    Übertrieben dargestellt, aber genau so sieht es eigentlich aus, es kommt darauf an, wie man es designed...

    Nun gut, wie das hier aussieht, weiß ich nicht.

    MfG mAV



  • Ich frage mich allerdings wozu deine SQL-Statements gut sind. Eine Schleife auf eine Select indem du dann ein UPDATE machst?

    Ich habe schonmal gesagt. Schreib genauer was du machen willst und wir optimieren vieleicht den Code oder den Query



  • Hm, das wird leider nicht möglich sein, weil das ganze auslesen/updaten so komplex ist, dass ihr das bestimmt nicht überschauen könnt ! ( in relevanter Zeit 🙂 )



  • @JJ
    Probieren geht über studieren... 😉



  • Hi,

    sag mal, benutzt du zum ändern der Werte in einer Tabelle die Werte aus der Tabelle, oder einer anderen Tabelle selbst???

    Dann würd ich das versuchen alles in ein SQL-Statement zu schreiben und das ganze dann an mysql schicken. Dann hat die geschwindigkeit von PHP oder C++ doch keinen Unterschied mehr. Oder woher bekommst du jede Stunde 200.000 geänderte Werte, wenn nicht aus einer Tabelle?



  • Hi,

    @datobi2k:
    Also ich programmiere gerade an einem Game. Und die Werte müssen jede Stunde(pro Tick) geupdatet werden.
    In meinem Fall sind eig. alle Werte die ich brauche in der Tabelle ( in mehereren verteilt ).

    Mein Problem beschänkt sich aber eher das Daten-Format das in den Feldern gespeichert ist. ( "serialize"-funktion von php).
    Es wird leider nicht möglich sein mit dem Mysql-Script dieses Format zu decodieren.

    Ich hab mir überlegt das Format in ein durch ein in Komma getrennte Zeichkette, welche die Werte enthält, zu ändern.
    Dadurch kann ich dann per MYSQL die zeichenkette teilweise auslesen!

    Hm, vielleicht könnt ihr mal ein Statement dazu geben, wie ihr sowas gelöst habt / oder lösen würdet ! 😕

    Soo, nun will ich vielleicht doch noch was ansprechen.
    Ich habe zwei Tabellen: "solar_systems" und "planets".

    Zu jedem Solar-System gibt es mehrere Planeten.
    Um die Planeten zu updaten brauche ich informationen von Solar-System.

    Ist es nun möglich durch einen ->einzigen<- Update das richtige Solar-System zu selectieren mit den Planeten in der anderen Tabelle, und diese auch dann mit den Werten zu updaten.
    Also die Planeten brauchen keine daten untersich, sondern nur von dem Solar-System.

    .. hm so jetzt es es doch wieder laange geworden. 😃

    Bye



  • JayJay schrieb:

    Hi,

    Hm, vielleicht könnt ihr mal ein Statement dazu geben, wie ihr sowas gelöst habt / oder lösen würdet ! 😕

    Bye

    Ich leider nicht. Warum ?

    so komplex ist, dass ihr das bestimmt nicht überschauen könnt !

    Ich kann dazu aber folgendes sagen. Wenn du eine Tabelle mit Werten aus einer anderen Tabelle Updaten musst dann hast du vermutlich eine Problem mit der Normalisierung relationaler DB`s.

    Wenn die Selecttabelle 200.000 Datensätze hat machst du 200 000 UPDATES. Ob das sinnvoll ist frage ich mich jetzt schon.



  • Hi,

    ist es nicht vielleicht sinnvoll zu jedem User den letzten Tick abzuspeichern, und wenn nun ein User wieder auf die Seite geht oder er angegriffen wird etc. die Differenz mit einer Funktion auszugleichen und einzutragen? für Ressourcen zum Beispiel. Ist nur ne Idee damit du nicht soviel auf einmal aktualieren musst, sonder nur "on demand" quasi..

    Zu der anderen Frage:

    update planets, solar_systems
    set planets.steine = planets.steine + solar_systems.steineprotick
    where planets.solar_systems = solar_systems.id;

    Damit würdest du jetzt jedem Planeten beim ausführen soviel zusätzliche
    steine hinzufügen wie es in dem Solarsystem pro Tick gibt

    sowas in der art ?



  • @Tow-B.de:
    1)
    Naja diese Idee hatten wir auch erstmals, jedoch zieht das Vorteile & Nachteile mitsich. Endlich haben wir uns dann für ein globales Update für alle pro Tick entschieden!

    Jo, genau das hab ich gesucht. Hab mir schon gedacht, dass es so funktioniert war mich aber nicht sicher! nochmals Danke!

    @Unix-Tom:

    Unix-Tom schrieb:

    JayJay schrieb:

    Hi,

    Hm, vielleicht könnt ihr mal ein Statement dazu geben, wie ihr sowas gelöst habt / oder lösen würdet ! 😕

    Bye

    Ich leider nicht. Warum ?

    ....

    Wenn die Selecttabelle 200.000 Datensätze hat machst du 200 000 UPDATES. Ob das sinnvoll ist frage ich mich jetzt schon.

    Hm, es ist eig. schon sinnvoll den Spielstand nach jedem tick zu updaten ! 🙂

    Bye


Anmelden zum Antworten