2016-06-29 17 views
0

ich den folgenden Code verwenden:Wann soll ich in PHP unset Leistung verbessern

for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60 

    $t = $response[0][$x]; 
    $query = "INSERT INTO tableX (time,title) VALUES ('$date','$t')"; 

    if ($query_run = mysqli_query($mysql_connect, $query)) { 

    //Call some functions if the insertion happens 

    } 
} 

mysqli_close($mysql_connect); 

Titel in der Tabelle ein pimary Schlüssel. Ich werde einige Funktionen nur aufrufen, wenn die Einfügung erfolgreich ist, d. H. Kein existierender Titel wird bereitgestellt. Der Titel und das Datum stammen aus einer CSV-Datei.

Wie kann ich die Leistung dieses Codes verbessern? Wann sollte ich unset verwenden, um CPU-Speicherzyklen zu speichern?

+0

Vorschlag: Wenn Sie die * title * -Spalte als Primärschlüssel Ihrer Tabelle definieren möchten, wenden Sie die Funktion 'array_unique()' auf das $ $ response [0] '- Array vor der' for' -Schleife an. –

Antwort

2

Diese Frage basiert ausschließlich auf den falschen Voraussetzungen.

Zunächst einmal, nirgendwo mit Unset sparen Sie einen CPU-Zyklus, aber lieber cousme sie.

Außerdem gibt es nicht viel Platz, um trotzdem unscharf zu setzen.

Schließlich gibt es keine echte Probleme mit der Leistung mit diesem Code.Wenn Sie welche haben, sollten Sie sie ausnutzen, einen echten Flaschenhals entdecken und dann reparieren, anstatt herumzustöbern und willkürliche Bäume zu bellen.

Was sollte Ihr eigentliches Anliegen sein, statt fiktiver Performance-Probleme, ist, dass Ihr Code weit offen für SQL-Injektionen und Syntaxfehler aller Art.

+0

Vielen Dank für den Hinweis auf das Problem. Kannst du bitte etwas ausarbeiten damit ich es beheben kann ... –

2

Unset wird hier die Leistung durch keine sinnvolle Metrik verbessern.

Was wird verbessern die Leistung aktualisiert mehr als eine Zeile pro Abfrage.

Nehmen wir Ihren Code als Beispiel. Dies ist nur ein Beispiel dafür, wie es sein könnte. Wenn Sie nach dem Einfügen weitere Funktionen ausführen müssen, sollten Sie beispielsweise anstelle von ALLE Zeilen jeweils 10 oder 100 Zeilen gleichzeitig aktualisieren.

$query = "INSERT INTO tableX (time,title) VALUES "; 
$valueQuery = array(); 

for ($x = 0; $x < count($response[0]); $x++) { //approx count 50-60 
    $t = $response[0][$x]; 
    $valueQuery[] = "('$date','$t')"; 
} 
$query .= implode(", ",$valueQuery); 

if ($query_run = mysqli_query($mysql_connect, $query)) { 
    //Call some functions if the insertion happens 
} 
+1

Eine Faustregel, die ich mir ausgedacht habe: Ein "Batch-Insert" von 100 Zeilen wird _10_ mal so schnell wie 100 separate Einfügungen laufen. (Das ist viele Größenordnungen mehr Beschleunigung als ein lumpiges Unset().) –

1

Sie könnten den angezeigten Code verbessern, indem Sie vorbereitete Anweisungen für Ihre Einfügung (1) verwenden. So müssen Sie bei jeder Iteration zuerst die $ query definieren und dann ausführen. Bei jeder Ausführung müsste die Datenbank auch zuerst Ihre Aussage analysieren.

Indem Sie die Anweisung vor dem Eintritt in die Schleife vorbereiten, definieren Sie sie nur einmal und können sie nur mit den verschiedenen Werten ausführen. Außerdem wird die Anweisung nur analysiert, wenn sie vorbereitet wird, sie wird nicht bei jeder Ausführung geparst.

Hier ist eine kleine artice auf, wie der Müll-Sammler in PHP funktioniert: http://www.hackingwithphp.com/18/1/10, in dieser Frage gefunden: Is there garbage collection in PHP?

PHP führt Garbage Collection in drei primären Verbindungspunkte:

When you tell it to 

When you leave a function 

When the script ends 

Vielleicht sollten Sie überprüfen, wie viel von Ihrem Programm Sie in Funktionen einkapseln können, obwohl es in Ihrem Snippet nicht viel zu sehen gibt.

(1)

Ich schlage vor, die vorbereiteten Anweisungen zur Verbesserung der Effizienz. Es ist die beste Vorgehensweise, die Arbeitslast zu reduzieren - das unnötige Parsen der Abfrage.

So habe ich keine Schätzung über die tatsächliche Leistungsverbesserung, obwohl, wie in diesem Fall über 50 bis 60 Iterationen gesprochen wird, wäre es minimal, wenn sogar bemerkbar.

+0

Was ist der * tatsächliche * Leistungsgewinn, den Sie erwarten, wenn Sie vorbereitete Anweisungen in diesem Code verwenden? In Zahlen –

+0

Vorgeschlagene Aussagen zur Verbesserung der Effizienz. Es ist die beste Vorgehensweise, die Arbeitslast zu reduzieren - das unnötige Parsen der Abfrage. Ich habe also keine Einschätzung über die Leistungsverbesserung, wenn ich aber von 50-60 Iterationen sprechen würde, wäre das minimal, wenn nicht sogar bemerkbar. – Philipp

+0

Ich denke, es ist es wert, in Ihrer Antwort zu erwähnen, weil Menschen dazu neigen, eine völlig falsche Vorstellung von den Leistungsvorteilen der vorbereiteten Aussagen zu haben. Obwohl es den Punkt der Antwort selbst in Frage stellt –