Verbessere die Leistung von PHP auf dem lokalen Server

8

Ich habe eine XAMPP-Installation mit ziemlich der Standardkonfiguration.

Leistung ist im Allgemeinen kein großes Problem, da ich PHP hauptsächlich zum Ausführen von Webseiten und kleinen Web-Apps verwende. Ein paar Sekunden auf eine Seite zu warten ist nicht ungewöhnlich.

Ich habe jedoch kürzlich die Probleme von Project Euler aufgegriffen und beschlossen, sie in PHP zu machen.

Wie dem auch sei, ich konnte meinen Code nicht in weniger als 1 Minute 1 Sekunde laufen lassen (optimiert von fast 3 Minuten) und es wurde mir ziemlich peinlich, vor allem wenn man bedenkt, dass die meisten Poster auf Pjt Euler mal 1 waren -3 Sekunden. (# 7, finde die 10001. Primzahl)

Ich habe meinen Code nach C # portiert, und die gleiche Aufgabe wurde im Handumdrehen erledigt. 0,4 Sekunden. Derselbe Algorithmus, der einzige bemerkenswerte Unterschied im Code ist, dass ich eine Liste in C # verwendet habe, um das Array zu ersetzen, das ich in PHP benutzt habe.

Obwohl ich erwartet habe, dass C # php übertrifft, führt mich dieser Unterschied zu einem groben Konfigurationsproblem, aber ich habe keine Ahnung, wo ich suchen soll.

Was könnte die Ursache für diese schlechte Leistung sein?

Bearbeiten: Hier ist der Code:

In PHP:

%Vor%

In C #:

%Vor%     
Sylverdrag 24.05.2011, 16:07
quelle

3 Antworten

2

ENDBEARBEITEN

Hier ist der PHP-Code aus Bakudans Logik, der dieses Ergebnis zurückgibt:

%Vor%

Der Code:

%Vor%

Bakudan gab mir den Pseudocode, den ich gerade übersetzt und für das OP-Skript oben geschrieben habe.

BEARBEITEN 2

Ich habe den Code etwas aufgeräumt, nichts verbessert, kann "Lesbarkeit" verbessern. Aber ja, ich denke, das ist das Beste, was du mit PHP bekommst, was auf einem i7 ohne Apache 5 Sekunden bringt.

%Vor%

BEARBEITEN

Klopfte eine weitere Sekunde durch Verschieben der $prime === 1 nach der $number % $prime Prüfung in der gleichen if Anweisung.

%Vor%

Ich nehme den Vorschlag von Hannes, das Array als Referenz zu überprüfen und weiterzuleiten und ein paar Verbesserungen hinzuzufügen (das Array innerhalb der Funktion zu modifizieren):

%Vor%

Was am Ende war:

%Vor%

VS dein Code:

%Vor%

Eine gute Verbesserung dort, aber nichts wie C #, zeigt nur die Macht einer kompilierten Sprache:)

    
Brad F Jacobs 24.05.2011, 16:53
quelle
4

"Verwenden Sie force ..." von math ! Einfach sinnlosen Code wegwerfen. Hier sind nur ein paar Punkte, die die Leistung steigern können.

  • warum verwenden Sie Array, um die Zahl gegen?
  • anzupassen
  • die foreach-Funktion ist somit unwirksam - der Zyklus sollte bei floor(sqrt(number))

    enden

    Beispiel: sqrt (64) = 8 - & gt; alle Hauptteiler werden von 1 bis 8 sein. Die anderen werden ein Produkt von ihnen sein (32 = 4 x 8 = 2x2x2x2x2)

  • Verwenden Sie Formeln, um zur nächsten möglichen Primzahl zu springen

    math:

    Zahlen, die durch 2 - 2, 4, 6, 8, 10, 12 teilbar sind - & gt; 2k + 1 = 2x1 + 1 = 3, 5, .....

    durch 3 - 3 teilbare Zahlen, 6 , 9, 12 - & gt; wir haben bereits 6 und 12, also 3, 9, 15, 21 - & gt; 3 (2k-1) = 3 (2x1-1) = 3, 9, ...

Hier ist ein Pseudocode von hk admin beim Projekt euler

%Vor%

PS

Über den Unterschied in der Geschwindigkeit der Ausführung - PHP ist interpretierte Sprache, um das Ergebnis im Browser zu sehen, haben Sie 3 Programme laufen - Browser, Server, PHP-Interpreter. Sie machen eine HTTP-Anfrage, der Server ruft php auf (und wahrscheinlich eine Menge anderer Sachen, zum Beispiel Logging), php liest das Skript und führt es aus. Es gibt viel mehr Schritte als in C #.

In C # wird der kompilierte Code ausgeführt.

    
Bakudan 24.05.2011 18:11
quelle
1
  

Ich habe zwar erwartet, dass C # übertroffen wird   php, dieser Unterschied führt mich zu   vermute ein grobes Konfigurationsproblem,   aber ich habe keine Ahnung, wo ich hinschauen soll.

Durch das Starten der PHP-Engine entsteht ein kleiner Aufwand für den Webserver. Die Art und Weise, wie PHP geladen wird (z. B. geladen als ein Modul beim Serverstart oder geladen bei Bedarf für jede .php-Anfrage) bestimmt, wie viel Overhead involviert ist. Dann stehen unter Windows zwei Varianten von PHP zur Verfügung: threadsicher und nicht threadsicher, letzterer soll schneller sein.

Wenn es ein XAMPP-Konfigurationsproblem ist, denke ich, dass Sie es isolieren können, indem Sie den Test dreimal auf Ihrem Webserver ausführen und die durchschnittliche Zeit notieren. Führen Sie dann dasselbe Skript dreimal über PHP CLI aus und notieren Sie den Durchschnitt. Wenn der Unterschied bemerkbar ist, könnten Sie XAMPP verantwortlich machen. Sie sollten die PHP CLI-Binärdatei irgendwo im XAMPP-Installationsordner finden können.

Auf meinem System bekomme ich diese Ergebnisse:

%Vor%

Kein großer Unterschied - ich würde den Code lieber optimieren.

BEARBEITEN

Gleiche Maschine und alles außer Ausführungszeit von ~ 30 Sekunden auf ~ 5,85 Sekunden mit diesem überarbeiteten Code. Erwähnenswert ist nur, dass ich bei jedem Aufruf der isPrime-Funktion ein globales Array verwendet habe, anstatt es nach Wert zu übergeben (104743 mal, um genau zu sein). Wenn das Array als Referenz übergeben wird, ergibt sich auch eine ähnliche Ausführungszeit, geben oder nehmen 1 Sekunde. Die Vergleichsoperatoren rasieren nur ein oder zwei Sekunden, aber nicht viel.

%Vor%     
Salman A 25.05.2011 06:21
quelle

Tags und Links