Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in PHP7-Updates und Leistungsoptimierung (Bilder und Text)

Einführung in PHP7-Updates und Leistungsoptimierung (Bilder und Text)

不言
不言nach vorne
2019-02-18 14:35:062983Durchsuche

Der Inhalt dieses Artikels ist eine Einführung (Bilder und Texte) über PHP7-Updates und Leistungsoptimierung. Ich hoffe, dass er für Freunde hilfreich ist Du hast geholfen.

PHP7-Innovation und Leistungsoptimierung

Ich hatte das Glück, am PHP Technology Summit (PHPCON) 2015 teilzunehmen und Bruder Niao (Hui Xinchen) über die neuen Funktionen zu hören von PHP7 Und das Teilen von Leistungsoptimierungen ist spannend. Bruder Niao ist der maßgeblichste PHP-Experte in China. Ich habe die geteilte PPT zusammengestellt und hoffe, dass sie für Studenten, die PHP entwickeln, nützlich sein kann .

PHP hat eine 20-jährige Geschichte hinter sich. Bis heute hat PHP7 eine RC-Version veröffentlicht. Es wird gesagt, dass die offizielle Version von PHP7 etwa im November 2015 veröffentlicht werden soll. Man kann sagen, dass PHP7 eine große Innovation im Vergleich zur vorherigen PHP5-Serie ist.*, insbesondere in Bezug auf die Leistung, die sprunghaft eine deutliche Verbesserung erzielt hat.

PHP ist eine weltweit verbreitete Webentwicklungssprache. Die Innovation von PHP7 wird sicherlich tiefgreifendere Veränderungen für diese Webdienste mit sich bringen. Hier ist ein Diagramm aus Niao Ges PPT (82 % der Websites verwenden PHP als Entwicklungssprache):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

(Hinweis: Eine Website kann bei ihrer Entwicklung mehrere Sprachen verwenden Sprache)

(Hinweis: Dieser Artikel enthält viele Screenshots von Bruder Niaos PPT. Das Copyright der Bilder liegt bei Bruder Niao)

Werfen wir zunächst einen Blick auf zwei aufregende Auftritte. Testergebnistabelle:

Benchmark-Vergleich (Bild von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

PHP7-Leistungstestergebnisse, Leistungsstresstestergebnisse, Zeitverbrauch sank von 2,991 auf 1,186, ein deutlicher Rückgang von 60 %.

WordPress QPS-Stresstest (Bild aus PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Im WordPress-Projekt PHP7 im Vergleich zu PHP5.6 stiegen die QPS um das 2,77-fache.

Nachdem wir den spannenden Vergleich der Leistungstestergebnisse gelesen haben, kommen wir zur Sache. Es gibt viele neue Funktionen in PHP7, wir werden uns jedoch mehr auf die wichtigsten Änderungen konzentrieren.

1. Neue Funktionen und Änderungen

1. Skalare Typdeklarationen und Skalare Typdeklarationen

PHP-Sprache Eine sehr wichtige Funktion ist „schwache Typisierung“ , was das Schreiben von PHP-Programmen sehr einfach macht und Anfängern einen schnellen Einstieg ermöglicht, wenn sie mit PHP in Berührung kommen. Dies ist jedoch auch mit einigen Kontroversen verbunden. Man kann sagen, dass die Unterstützung der Definition von Variablentypen eine innovative Änderung darstellt. PHP beginnt damit, Typdefinitionen auf optionale Weise zu unterstützen. Darüber hinaus wird auch eine Switch-Anweisung „declare(strict_type=1)“ eingeführt. Sobald diese Anweisung aktiviert ist, wird das Programm unter der aktuellen Datei gezwungen, strikte Funktionsparameter-Übertragungstypen und Rückgabetypen zu befolgen.

Eine Additionsfunktion plus eine Typdefinition kann beispielsweise wie folgt geschrieben werden:

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

In Kombination mit der obligatorischen Typwechselanweisung kann sie geschrieben werden so:

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Wenn strict_type nicht aktiviert ist, wird PHP versuchen, Ihnen bei der Konvertierung in den erforderlichen Typ zu helfen. Nach dem Aktivieren ändert es PHP und nicht mehr Wenn der Typ nicht übereinstimmt, wird ein Typfehler ausgegeben. Das sind großartige Neuigkeiten für Schüler, die „stark typisierte“ Sprachen mögen.

Detailliertere Einführung:

PHP7 Scalar Type Declaration RFC [Übersetzung]

2. Mehr Fehler werden zu abfangbaren Ausnahmen

PHP7 implementiert eine globale ausführbare Schnittstelle. Die ursprüngliche Ausnahme und einige Fehler implementieren diese Schnittstelle (Schnittstelle) und definieren die Vererbungsstruktur von Ausnahmen in Form von Schnittstellen. Dadurch werden mehr Fehler in PHP7 zu abfangbaren Ausnahmen und werden an Entwickler zurückgegeben. Wenn sie nicht abgefangen werden, handelt es sich um Fehler. Wenn sie abgefangen werden, werden sie zu Ausnahmen, die innerhalb des Programms behandelt werden können. Bei diesen abfangbaren Fehlern handelt es sich in der Regel um Fehler, die dem Programm keinen schwerwiegenden Schaden zufügen, beispielsweise eine nicht vorhandene Funktion. PHP7 vereinfacht die Verarbeitung für Entwickler weiter und gibt Entwicklern eine größere Kontrolle über das Programm. Denn standardmäßig führt ein Fehler direkt dazu, dass das Programm unterbrochen wird, und PHP7 bietet die Möglichkeit, ihn zu erfassen und zu verarbeiten, sodass das Programm weiterhin ausgeführt werden kann, was Programmierern flexiblere Auswahlmöglichkeiten bietet.

Um beispielsweise eine Funktion auszuführen, bei der wir nicht sicher sind, ob sie existiert oder nicht, besteht die PHP5-kompatible Methode darin, die Beurteilung function_exist anzuhängen, bevor die Funktion aufgerufen wird, während PHP7 die Methode zum Abfangen von Ausnahmen unterstützt.

Das Beispiel im Bild unten (der Screenshot stammt aus der PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

3. AST (Abstract Syntax Tree, Abstract Syntax Tree)

AST Als Middleware im PHP-Kompilierungsprozess ersetzt es die ursprüngliche Methode, Opcode direkt vom Interpreter auszuspucken, und entkoppelt den Interpreter (Parser) und den Compiler (Compliler), wodurch einige Hack-Codes reduziert und die Implementierung leichter verständlich gemacht werden können . und wartbar.

PHP5:

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

PHP7:

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Weitere AST-Informationen:

https://wiki.php.net/rfc/abstract_syntax_tree

4. Natives TLS (Native Thread Local Storage, Native Thread Local Storage)

PHP im Multithread-Modus (z. B. Die Woker- und Event-Modi des Webservers Apache sind Multithread-fähig und müssen das Problem der „Thread-Sicherheit“ (TS, Thread Safe) lösen. Da Threads den Speicherplatz des Prozesses gemeinsam nutzen, muss jeder Thread selbst etwas passieren Erstellen Sie auf diese Weise einen privaten Bereich, um Ihre eigenen privaten Daten zu speichern und eine gegenseitige Kontamination mit anderen Threads zu vermeiden. Die von PHP5 übernommene Methode besteht darin, ein großes globales Array zu verwalten und jedem Thread einen unabhängigen Speicherplatz zuzuweisen. Threads greifen über ihre eigenen Schlüsselwerte auf diese globale Datengruppe zu.

In PHP5 muss dieser eindeutige Schlüsselwert an jede Funktion übergeben werden, die globale Variablen verwenden muss. PHP7 ist der Ansicht, dass diese Übergabemethode nicht benutzerfreundlich ist und einige Probleme aufweist. Versuchen Sie daher, eine globale Thread-spezifische Variable zu verwenden, um diesen Schlüsselwert zu speichern.

Verwandte native TLS-Probleme:

https://wiki.php.net/rfc/native-tls

Weitere neue Funktionen

Dort Es gibt viele neue Funktionen und Änderungen in PHP7, daher gehen wir hier nicht näher darauf ein.

(1) Int64-Unterstützung, Vereinheitlichung der Ganzzahllängen auf verschiedenen Plattformen, Unterstützung von Zeichenfolgen und Datei-Uploads mit mehr als 2 GB.

(2) Einheitliche Variablensyntax.

(3) Konsistentes foreach-Verhalten

(4) Neue Operatoren <=>, ??

(5) Unicode-Zeichenformatunterstützung (u{xxxxx})

(6) Anonyme Klassenunterstützung (Anonyme Klasse)

… …

2. Sprunghafter Leistungsdurchbruch: Volle Kraft voraus

1 und Leistung

Just In Time (Just-in-Time-Kompilierung) ist eine Softwareoptimierungstechnologie, die Bytecode nur dann in Maschinencode kompiliert, wenn er ausgeführt wird. Aus intuitiver Sicht ist es für uns leicht zu glauben, dass Maschinencode direkt von Computern erkannt und ausgeführt werden kann und dass es effizienter ist als Zend, Opcode zu lesen und einzeln auszuführen. Unter ihnen verwendet HHVM (HipHop Virtual Machine, HHVM ist eine virtuelle Open-Source-PHP-Maschine von Facebook) JIT, was ihren PHP-Leistungstest um eine Größenordnung verbessert und ein schockierendes Testergebnis veröffentlicht, das uns auch intuitiv denken lässt, dass JIT A ist leistungsstarke Technologie, die Stein in Gold verwandelt.

Tatsächlich haben Bruder Niao und Dmitry (einer der Kernentwickler der PHP-Sprache) im Jahr 2013 einmal einen JIT-Versuch mit der PHP5.5-Version unternommen (sie wurde nicht veröffentlicht). Der ursprüngliche Ausführungsprozess von PHP5.5 besteht darin, den PHP-Code durch lexikalische und syntaktische Analyse in Opcode-Bytecode zu kompilieren (das Format ähnelt in gewisser Weise der Assemblierung). Anschließend liest die Zend-Engine diese Opcode-Anweisungen, analysiert sie und führt sie einzeln aus.

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Und sie führten nach dem Opcode-Link eine Typinferenz (TypeInf) ein und generierten dann vor der Ausführung ByteCodes über JIT.

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Dadurch wurden im Benchmark (Testprogramm) spannende Ergebnisse erzielt. Nach der Implementierung von JIT stieg die Leistung im Vergleich zu PHP5.5 um das 8-fache. Als sie diese Optimierung jedoch in das eigentliche Projekt WordPress (ein Open-Source-Blogging-Projekt) einbauten, stellten sie fast keine Leistungsverbesserung fest und erhielten ein rätselhaftes Testergebnis.

Deshalb nutzten sie das Profiltyp-Tool unter Linux, um den CPU-Zeitverbrauch der Programmausführung zu analysieren.

Verteilung des CPU-Verbrauchs bei 100-maliger Ausführung von WordPress (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Hinweis:

21 % der CPU-Zeit beträgt für die Speicherverwaltung aufgewendet.

12 % der CPU-Zeit werden für Hash-Tabellenoperationen aufgewendet, hauptsächlich für das Hinzufügen, Löschen, Ändern und Überprüfen von PHP-Arrays.

30 % der CPU-Zeit werden für integrierte Funktionen wie strlen aufgewendet.

25 % der CPU-Zeit werden in VM (Zend Engine) verbracht.

Nach der Analyse wurden zwei Schlussfolgerungen gezogen:

(1) Wenn die von JIT generierten ByteCodes zu groß sind, sinkt die CPU-Cache-Trefferrate (CPU-Cache-Miss)

Da es im PHP5.5-Code keine offensichtliche Typdefinition gibt, können wir uns nur auf die Typinferenz verlassen. Definieren Sie die Variablentypen, auf die so weit wie möglich geschlossen werden kann, und entfernen Sie dann in Kombination mit der Typinferenz Zweigcodes, die nicht von diesem Typ sind, um direkt ausführbaren Maschinencode zu generieren. Allerdings kann die Typinferenz nicht alle Typen ableiten. In WordPress sind weniger als 30 % der Typinformationen, die abgeleitet werden können, begrenzt, und der Verzweigungscode, der reduziert werden kann, ist begrenzt. Infolgedessen wird nach JIT direkt Maschinencode generiert und die generierten ByteCodes sind zu groß, was schließlich zu einem erheblichen Rückgang der CPU-Cache-Treffer (CPU-Cache-Miss) führt.

CPU-Cache-Treffer bedeutet, dass während des Prozesses des Lesens und Ausführens von Anweisungen durch die CPU die Suche nach unten bis zur zweiten Ebene fortgesetzt werden muss, wenn die erforderlichen Daten nicht im Cache der ersten Ebene (L1) gelesen werden können Zwischen dem Cache (L2) und dem Cache der dritten Ebene (L3) wird schließlich versucht, die erforderlichen Befehlsdaten im Speicherbereich zu finden, und der Lesezeitunterschied zwischen dem Speicher und dem CPU-Cache kann das 100-fache erreichen. Wenn daher die ByteCodes zu groß sind und die Anzahl der ausgeführten Anweisungen zu groß ist, kann der mehrstufige Cache nicht so viele Daten aufnehmen und einige Anweisungen müssen im Speicherbereich gespeichert werden.

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Die Größe der Caches auf allen Ebenen der CPU ist ebenfalls begrenzt. Das folgende Bild zeigt die Konfigurationsinformationen von Intel i7 920:

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Daher führt die Verringerung der CPU-Cache-Trefferrate zu einem erheblichen Anstieg des Zeitverbrauchs. Andererseits wird die durch JIT erzielte Leistungsverbesserung dadurch auch ausgeglichen.

Durch JIT kann der Overhead von VM reduziert werden. Gleichzeitig kann durch die Befehlsoptimierung die Entwicklung der Speicherverwaltung indirekt reduziert werden, da die Anzahl der Speicherzuweisungen reduziert werden kann. Bei echten WordPress-Projekten werden jedoch nur 25 % der CPU-Zeit für die VM aufgewendet, und das Hauptproblem und der Hauptengpass liegt nicht tatsächlich in der VM. Daher war der JIT-Optimierungsplan nicht in den PHP7-Funktionen dieser Version enthalten. Es ist jedoch wahrscheinlich, dass es in einer späteren Version implementiert wird, worauf es sich zu freuen lohnt.

(2) Der Verbesserungseffekt der JIT-Leistung hängt vom tatsächlichen Engpass des Projekts ab

JIT wurde im Benchmark erheblich verbessert, da die Codemenge relativ gering ist und die endgültigen ByteCodes generiert werden sind ebenfalls relativ gering und der Hauptaufwand liegt in der VM. Im eigentlichen WordPress-Projekt gibt es jedoch keine offensichtliche Leistungsverbesserung, da das Codevolumen von WordPress viel größer ist als das des Benchmarks. Obwohl JIT den Overhead der VM reduziert, führt es zu einer Verringerung der CPU-Cache-Treffer und zu zusätzlichem Speicher ByteCodes sind zu groß. Der Overhead führt letztendlich zu keiner Verbesserung.

Verschiedene Arten von Projekten haben unterschiedliche CPU-Overhead-Verhältnisse und erzielen auch unterschiedliche Ergebnisse. Leistungstests ohne tatsächliche Projekte sind nicht sehr repräsentativ.

2. Änderungen in Zval

Tatsächlich ist Zval der eigentliche Speicherträger verschiedener Arten von Variablen, der sich durch seine Toleranz und Toleranz auszeichnet. Im Wesentlichen handelt es sich um eine Struktur (Struktur), die in der C-Sprache implementiert ist. Für Studenten, die PHP schreiben, können Sie es grob als etwas Ähnliches wie ein Array verstehen.

Zval von PHP5, der Speicher belegt 24 Bytes (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Zval von PHP7, der Speicher belegt 16 Bytes (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Zval ist von 24 Byte auf 16 Byte gesunken. Warum muss ich hier ein wenig C-Sprachgrundlage hinzufügen, um denjenigen zu helfen, die mit C nicht vertraut sind? Schüler verstehen. Es gibt einen kleinen Unterschied zwischen Struktur und Union (Union). Jede Mitgliedsvariable von Struct belegt einen unabhängigen Speicherplatz, während sich die Mitgliedsvariablen in Union einen Speicherplatz teilen (d. h. wenn eine der Mitgliedsvariablen geändert wird). Der öffentliche Raum wird sein. Nach der Änderung werden keine Datensätze anderer Mitgliedsvariablen vorhanden sein. Obwohl es scheinbar viel mehr Mitgliedsvariablen gibt, hat sich der tatsächlich belegte Speicherplatz verringert.

Darüber hinaus gibt es offensichtlich geänderte Funktionen, einige einfache Typen verwenden keine Referenzen mehr.

Zval-Strukturdiagramm (aus PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Zval im Bild besteht aus zwei 64-Bits (1 Byte = 8 Bit, Bit ist „Bit“). Wenn der Variablentyp lang oder bealoon ist und die Länge 64 Bit nicht überschreitet, wird er direkt im Wert gespeichert , und es wird kein folgendes zitiert. Wenn es sich bei dem Variablentyp um ein Array, ein Objekt, eine Zeichenfolge usw. mit mehr als 64 Bit handelt, ist der gespeicherte Wert ein Zeiger, der auf die tatsächliche Speicherstrukturadresse zeigt.

Für einfache Variablentypen wird die Zval-Speicherung sehr einfach und effizient.

Typen, die keine Referenzen erfordern: NULL, Boolean, Long, Double

Typen, die Referenzen erfordern: String, Array, Objekt, Ressource, Referenz

Interner Typ zend_string

Zend_string ist die Struktur, die tatsächlich Strings speichert. Der eigentliche Inhalt wird in val (char, Zeichentyp) gespeichert, und val ist ein char-Array mit einer Länge von 1 (praktisch für die Belegung mit Mitgliedsvariablen).

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Die letzte Mitgliedsvariable der Struktur verwendet ein char-Array anstelle von char*. Hier ist ein kleiner Optimierungstrick, der CPU-Cache-Fehler reduzieren kann.

Wenn Sie ein char-Array verwenden und malloc den Speicher der obigen Struktur anwendet, wird es im selben Bereich angewendet. Normalerweise beträgt die Länge sizeof(_zend_string) + tatsächlicher char-Speicherplatz. Wenn Sie jedoch char* verwenden, ist das, was an dieser Stelle gespeichert wird, nur ein Zeiger, und die tatsächliche Speicherung erfolgt in einem anderen unabhängigen Speicherbereich.

Vergleich der Speicherzuweisung mit char[1] und char*:

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Aus Sicht der logischen Implementierung gibt es eigentlich keinen großen Unterschied zwischen zwei. Der Effekt ist sehr ähnlich. Wenn diese Speicherblöcke in die CPU geladen werden, sehen sie tatsächlich ganz anders aus. Da es sich bei Ersterem um denselben Speicher handelt, der kontinuierlich gemeinsam zugewiesen wird, kann er normalerweise zusammen abgerufen werden, wenn die CPU ihn liest (da er sich im Cache derselben Ebene befindet). Letzteres enthält Daten aus zwei Speichern. Wenn die CPU den ersten Speicher liest, ist es sehr wahrscheinlich, dass sich die Daten des zweiten Speichers nicht im Cache derselben Ebene befinden, sodass die CPU unterhalb von L2 (sekundärer Cache) suchen muss even to Das gewünschte zweite Stück Speicherdaten wird im Speicherbereich gefunden. Dies führt zu einem CPU-Cache-Fehler und der zeitaufwändige Unterschied zwischen beiden kann bis zu 100 Mal betragen.

Darüber hinaus kann zend_string beim Kopieren von Zeichenfolgen mithilfe der Referenzzuweisung Speicherkopien vermeiden.

6. Änderungen in PHP-Arrays (HashTable und Zend Array)

Beim Schreiben von PHP-Programmen sind Arrays der am häufigsten verwendete Typ, und PHP5-Arrays werden mithilfe von HashTable implementiert. Um es grob zusammenzufassen: Es handelt sich um eine HashTable, die doppelt verknüpfte Listen unterstützt. Sie unterstützt nicht nur die Hash-Zuordnung für den Zugriff auf Elemente über Array-Schlüssel, sondern kann auch Array-Elemente durchlaufen, indem sie über foreach auf doppelt verknüpfte Listen zugreift.

PHP5 HashTable (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Dieses Bild sieht sehr kompliziert aus, mit verschiedenen Zeigern, die herumspringen, wenn wir den Schlüssel übergeben, wenn wir auf den Inhalt zugreifen Wenn man ein Element nach Wert sortiert, sind manchmal drei Zeigersprünge erforderlich, um den erforderlichen Inhalt zu finden. Der wichtigste Punkt ist, dass die Speicherung dieser Array-Elemente auf verschiedene Speicherbereiche verteilt ist. Auf die gleiche Weise muss die CPU beim Lesen durch die CPU im Cache auf niedrigerer Ebene oder sogar im Speicherbereich suchen, da sie sich wahrscheinlich nicht im Cache auf derselben Ebene befinden, was dazu führt, dass der CPU-Cache-Treffer abnimmt Erhöhung des Verbrauchs.

Zend Array von PHP7 (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Die neue Version der Array-Struktur ist sehr einfach und auffällig. Das größte Merkmal besteht darin, dass die gesamten Array-Elemente und die Hash-Zuordnungstabelle alle miteinander verbunden und im selben Speicher zugeordnet sind. Wenn Sie ein Array einfacher Ganzzahlen durchlaufen, ist die Effizienz sehr hoch, da die Array-Elemente (Bucket) selbst kontinuierlich im selben Speicher zugewiesen werden und der Zval der Array-Elemente die ganzzahligen Elemente intern speichert Es handelt sich auch um einen externen Linkzeiger, und alle Daten werden im aktuellen Speicherbereich gespeichert. Das Wichtigste ist natürlich, dass CPU-Cache-Miss vermieden werden können (Abnahme der CPU-Cache-Trefferrate).

Änderungen des Zend-Arrays:

(1) Der Wert des Arrays ist standardmäßig zval.

(2) Die Größe von HashTable sank von 72 auf 56 Byte, was einer Reduzierung um 22 % entspricht.

(3) Die Bucket-Größe wurde von 72 auf 32 Byte verringert, was einer Reduzierung um 50 % entspricht.

(4) Der Speicherplatz der Buckets von Array-Elementen wird gemeinsam zugewiesen.

(5) Der Schlüssel des Array-Elements (Bucket.key) zeigt auf zend_string.

(6) Der Wert des Array-Elements wird in den Bucket eingebettet.

(7) CPU-Cache-Fehler reduzieren.

7. Funktionsaufrufkonvention

PHP7 hat den Funktionsaufrufmechanismus durch die Optimierung des Parameterübertragungsprozesses verbessert, einige Anweisungen reduziert und die Ausführungseffizienz verbessert.

PHP5-Funktionsaufrufmechanismus (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

Im Bild sind die Anweisungen send_val und recv-Parameter im VM-Stack gleich, PHP7 erreicht die zugrunde liegende Optimierung des Funktionsaufrufmechanismus durch die Reduzierung dieser beiden Duplikate.

Funktionsaufrufmechanismus von PHP7 (Screenshot von PPT):

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

8. Durch Makrodefinition und Inline-Funktion (Inline) wird ermöglicht Der Compiler muss einen Teil der Arbeit im Voraus abschließen

Makrodefinitionen in der C-Sprache werden in der Vorverarbeitungsphase (Kompilierungsphase) ausgeführt, wodurch ein Teil der Arbeit im Voraus abgeschlossen wird, ohne dass Speicher zugewiesen wird, wenn das Programm ausgeführt wird, und kann ähnliche Funktionen implementieren, aber ohne den Overhead von Stack-Push und Popping von Funktionsaufrufen ist die Effizienz relativ hoch. Das Gleiche gilt für Inline-Funktionen. In der Vorverarbeitungsphase werden die Funktionen im Programm durch Funktionskörper ersetzt. Wenn das tatsächlich laufende Programm hier ausgeführt wird, entsteht kein Overhead durch Funktionsaufrufe.

PHP7 hat in diesem Bereich viele Optimierungen vorgenommen und viel Arbeit, die in der laufenden Phase erledigt werden muss, in die Kompilierungsphase gesteckt. Beispielsweise kann die Parametertypbeurteilung (Parameteranalyse) in der Kompilierungsphase abgeschlossen werden, da es sich hier bei allen Beteiligten um feste Zeichenkonstanten handelt, wodurch die spätere Ausführungseffizienz verbessert wird.

In der folgenden Abbildung wird beispielsweise die Art und Weise, wie mit dem Typ der übergebenen Parameter umgegangen wird, von der Schreibmethode links zur Makroschreibmethode rechts optimiert.

PHP7革新与性能优化 - 徐汉彬Hansion - 技术行者

3. Zusammenfassung

Niao Ge's PPT hat eine Reihe von Vergleichsdaten veröffentlicht, die besagen, dass WordPress 100 Mal in PHP5 ausgeführt wird .6 Dies führt zu 7 Milliarden CPU-Befehlsausführungen, während es in PHP7 nur 2,5 Milliarden Mal erforderlich ist, was einer Reduzierung um 64,2 % entspricht.

Beim gesamten Teilen von Brother Bird ist der tiefgreifendste Punkt, der mir gegeben wurde: Auf Details achten, viele kleine Optimierungen vornehmen, Stück für Stück ansammeln, zusammenzählen und schließlich zu erstaunlichen Ergebnissen zusammenlaufen. Ich denke, es ist wahrscheinlich der gleiche Grund, mit neun Leuten einen Berg zu bauen.

Es besteht kein Zweifel, dass PHP7 sprunghafte Fortschritte bei der Leistung erzielt hat. Wenn diese Erfolge auf das Websystem von PHP angewendet werden können, benötigen wir möglicherweise nur weniger Maschinen, um ein höheres Anforderungsvolumen zu unterstützen. Die Veröffentlichung der offiziellen Version von PHP7 ist voller endloser Erwartungen.

Das obige ist der detaillierte Inhalt vonEinführung in PHP7-Updates und Leistungsoptimierung (Bilder und Text). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen