Beeinträchtigt eine Menge if-Anweisungen die Rendering-Geschwindigkeit von PHP?

8

Ich habe mich gefragt, ob komplizierte if / else-Strukturen in meinem PHP-Code eine schlechte Designentscheidung sein könnten. Führt eine Menge von if-Anweisungen dazu, dass PHP langsam läuft, die Seite langsamer geladen wird usw.?

Dies ist der Code: (Ich habe keine Ahnung, wie WordPress is_page etc.)

%Vor%     
Junuxx 25.10.2011, 21:13
quelle

6 Antworten

12

Nein. In der Tat wird es tatsächlich in den meisten Fällen beschleunigen (weil es erlaubt ist, Blöcke von Code zu überspringen).

Nur wenn if-Anweisungen eine große Anzahl von if-Anweisungen verlangsamen, ist es erforderlich, dass die zu überprüfende Bedingung verarbeitet werden muss. Ein Beispiel wäre etwas wie:

%Vor%

Bei jeder Iteration durch die Schleife wird überprüft, ob count($some_array) == 0 . Das bedeutet, dass PHP bei jedem Durchlauf manuell gehen und count die Anzahl der Elemente in $some_array manuell ändern muss, da es sich möglicherweise geändert hat. Dies gilt auch für die Stoppbedingung in einer for-Schleife. Dies liegt daran, dass eine for-Schleife immer als while-Schleife umgeschrieben werden kann:

%Vor%

ist dasselbe wie ...

%Vor%

Wenn Sie darüber nachdenken, eine Menge if-Anweisungen in eine zusammenzufassen: nicht, dann werden Sie keine Vorteile erhalten. PHP macht einen Kurzschluss, was bedeutet, dass, wenn es einen Punkt erreicht, an dem es weiß, was das Ergebnis sein wird, es den Rest überspringt.

Beispiel: $a = 5; if ($a > 0 || $b > 100 || $c > 200) {} .
Sobald PHP feststellt, dass die Bedingung $a > 0 erfüllt ist, wird die gesamte Anweisung auf True zurückgesetzt (wegen der Verwendung von OR-Werten) und überprüft nicht $b > 100 oder $c > 200 .

Also, um Ihre Frage zu beantworten: Wenn Sie nicht eine gottlose Anzahl von Bedingungen haben, die jeweils komplizierte Berechnungen erfordern oder Nebenwirkungen haben, können Sie normalerweise die Menge davon als belanglos ansehen Wie jedoch andere festgestellt haben, kann eine zu viele if-Anweisungen die Lesbarkeit des Codes verringern. Wenn Sie eine Bedingung entfernen können, ohne dass sich dies auf das Verhalten des Codes auswirkt, war dies in vielen Fällen nicht erforderlich.

    
Mr. Llama 25.10.2011, 21:20
quelle
5

If-Klauseln sind einige der billigsten Operationen, die es leistungsmäßig gibt.

Allerdings , was Sie in setzen, kann die if-Klausel sehr langsam sein.

Zum Beispiel wird if (true) { ... } außerordentlich schnell sein, aber ein einziges if (calculatePi()) { ... } wird buchstäblich für immer dauern. Das if selbst ist so schnell, dass du dich nie darum kümmern musst, und außerdem beinhaltet so ziemlich alles was du tust eine Anzahl von if s, zum Beispiel wenn du for oder while machst Schleifen oder switch -Anweisungen. Alle diese enthalten intrinsisch if (ein oder mehrere) in ihnen.

Was das Design betrifft, so kann eine Menge von if s für andere Entwickler verwirrend sein, je nachdem, was du schreibst und wie es geschrieben ist. Manchmal ist es besser, wenn Sie switch / case-Anweisungen oder einen anderen Anwendungs-Workflow verwenden, aber um Ihnen die Wahrheit zu sagen, wird ein Haufen if s wahrscheinlich schneller arbeiten als jede andere Struktur, die Sie sich vorstellen können. Aber nehmen Sie das nur zu Herzen, wenn Ihre einzige Sorge Leistung ist. Entwerfen von Software ist nicht , ich wiederhole, nicht in erster Linie auf die Leistung. Gutes Software-Design bezieht sich auf andere Dinge wie Wartbarkeit, d. H. Wie einfach es ist, Ihren Code zu lesen und erfolgreich zu aktualisieren.

Kurz gesagt: Wenn Sie die Leistung optimieren, versuchen Sie nicht, die Anzahl der if s zu reduzieren. Konzentrieren Sie sich vielmehr darauf, wonach die if s fragen, oder was passiert, je nachdem, ob sie wahr oder falsch zurückgeben.

Ich hoffe, es hilft.

    
Teekin 25.10.2011 21:33
quelle
3

Sehr komplizierte if / else-Strukturen weisen in den meisten Fällen auf ein schlechtes Design hin. Sie können sich besser darauf konzentrieren, ein schlechtes Design zu verbessern als die Optimierung, vorzeitige Optimierung ist die Wurzel allen Übels! .

Wenn Sie ein Beispiel für die Art von Code geben, über den Sie sprechen, ist es vielleicht möglich, eine ausführlichere Antwort zu geben.

    
Jan-Henk 25.10.2011 21:17
quelle
2

Ich bin gerade auf ein sehr interessantes Stück Artikel von WPShout gestoßen, das verwendet eine sehr menschliche Analogie, die uns dazu einlädt, intelligenter zu programmieren, und warum tief verschachtelte if { .. } -Anweisungen nicht nur die Leistung, sondern auch die Wartbarkeit des Codes verschlechtern könnten. Wenn die Logik leistungsbewusst ist, ohne unnötige aufgeblähte Iterationsprüfungen, besteht die Chance, dass Sie einen ziemlich gut organisierten, reaktionsschnelleren Code erhalten.

CODE-BEISPIEL (extrahiert aus dem Artikel)

  

"Lassen Sie uns dies anhand zweier einfacher Codebeispiele verdeutlichen:   zuerst im bubble-style, dann im gateway-style ".

Schlecht: Bubble-Style

%Vor%

Gut: Gateway-Stil

%Vor%

HINWEISE ZUM BEISPIEL

Der Unterschied zwischen den beiden obigen Code-Snippets besteht in einer Schlüsselunterscheidung:

Die bubble-Methode fragt, ob wichtige Bedingungen erfüllt sind und führt nur Code aus, wenn sie wahr sind.

Die Gateway-Methode fragt, ob wichtige Bedingungen falsch sind und gibt sofort Anweisungen für jede Bedingung aus, wenn sie falsch ist.

Die bubble-Methode erzwingt das Verschachteln, weil Sie "true, true, true, true" überprüfen müssen, bevor Sie den Code aufrufen, den Sie ausführen möchten. Jede "true" Prüfung ist eine Verschachtelungsebene - eine Bedingung, in der der Code enthalten sein muss.

Die Gateway-Methode ist nicht verschachtelt: Wie Sie sehen, ist der Code nie mehr als eine logische Tiefe. Dies liegt daran, dass ein einmal übergebenes Gateway vollständig vergessen werden kann. Mit anderen Worten, da wir nach der Überprüfung von $is_first_thing_working nicht beendet wurden, wissen wir automatisch, dass $is_first_thing_working für den Rest des Codes true ist.

  

"Es ist wie im richtigen Leben: Wenn du neben mir im Geschichtsunterricht sitzt, ich   Ich weiß, du bist ein Mensch, ein Schüler an meiner Highschool usw. - oder du   wäre nie in meiner Klasse gewesen. Keine Notwendigkeit zu überprüfen. "

    
Adriano Monecchi 19.05.2016 09:49
quelle
0

Es geht nicht darum, zu viele if else-Anweisungen zu haben, sondern 1) die Reihenfolge von ihnen und 2) wie effizient Ihre Bedingungen sind

1) Wenn der andere Status in absteigender Reihenfolge der Wahrscheinlichkeit der Bedingungen sein sollte. In meiner speziellen wp_posts Datenbanktabelle haben 80% der Datensätze post_status von "draft", "pending", "trash" usw., aber nicht "publish". Etwa 40% der Datensätze haben "post" als post_type . Es würde also keinen Sinn haben,

zu haben %Vor%

aber es sollte in umgekehrter Reihenfolge gehen

In Bezug auf 2) schlägt das Datenbankschema von WordPress vor, dass in_category() langsam sein wird. Wenn es eine Frage ist, die Sie selbst schreiben, und natürlich hängt es davon ab, wie effizient Ihre Anfrage ist

    
ericn 08.03.2013 08:29
quelle
0

In gewisser Weise .. JA .
Ich sage dies unter Berücksichtigung eines Worst-Case-Szenarios, in diesem Fall ein sehr großes Modellobjekt mit vielen Bedingungen. Hier muss der Code alle bedingten Überprüfungen durchlaufen, was den Code verlangsamt.
Bedingte Anweisungen stellen eine Schwierigkeit für die Parallelisierung und Vektorisierung dar, und eine lange Reihe von IF-THEN kann auch Cache-Miss-Fehler und andere Effekte verursachen. Aber wenn das den Code am klarsten macht, dann benutze ihn.

    
Arun 26.12.2017 19:27
quelle

Tags und Links