Heim  >  Artikel  >  Backend-Entwicklung  >  Umfassende Interpretation der Optimierung und Verbesserungen der PHP8.0-Version

Umfassende Interpretation der Optimierung und Verbesserungen der PHP8.0-Version

Guanhui
Guanhuinach vorne
2020-06-29 09:51:518066Durchsuche

Umfassende Interpretation der Optimierung und Verbesserungen der PHP8.0-Version

Wenn Sie nicht unter einem Felsen gelebt haben oder in der Vergangenheit gelebt haben, werden Sie feststellen, dass JIT hereinkommtPHP 8: Die Umfrage wurde heute stillschweigend geschlossen, mit Eine überwältigende Mehrheit dafür. Zusammengeführt in PHP8, daher ist dies offiziell. Dieser Artikel erklärt umfassend die Optimierung und Verbesserung der PHP8.0-Version.

Offizielle PHP8-Ankündigung „PHP 8 ist da! Das PHP-Team hat die erste Beta-Version Alpha1 veröffentlicht

Lehnen Sie sich jetzt zurück und lesen Sie den folgenden Artikel, der mit Mythen aufräumt, in dem wir ein paar Dinge darüber klären, was JIT ist und welche Vorteile es bietet Bringen Sie Verwirrung und vertiefen Sie sich in die Funktionsweise (aber nur ein wenig, weil ich Sie nicht langweilen möchte).

Da ich nicht weiß, mit wem ich spreche, beginne ich mit einfachen Fragen und arbeite mich dann zu komplexen Fragen vor, die Sie überspringen können, wenn Sie bereits sicher sind, dass Sie es wissen Die Antwort auf die Frage im Titel Dieser Teil. . .

Was ist JIT?

PHP implementiert eine virtuelle Maschine, einen virtuellen Prozessor, den wir Zend VM nennen. PHP kompiliert für Menschen lesbare Skripte in Anweisungen (wir nennen sie Opcodes), die die virtuelle Maschine verstehen kann. Diese Ausführungsphase nennen wir „Kompilierungszeit“. Während der „Laufzeit“-Phase der Ausführung führt die virtuelle Maschine (Zend VM) die Anweisungen des Codes (Opcodes) aus.

Das funktioniert alles großartig, Tools wie APC (früher) und OPCache (jetzt) ​​können die Anweisungen des Codes (Opcodes) zwischenspeichern, sodass die „Kompilierungszeit“ nur dann erfolgt, wenn es sein muss.

Zunächst gibt es eine Codezeile, die erklärt, was JIT ist:

Just-in-time ist eine Compilerstrategie, die eine Zwischendarstellung des Codes akzeptiert und diese zur Laufzeit in Abhängigkeiten einer architekturspezifischen Maschine umwandelt Code für die rechtzeitige Ausführung.

In PHP bedeutet dies, dass das JIT die von Zend VM generierten Anweisungen als Zwischendarstellung verwendet und architekturabhängigen Maschinencode ausgibt, sodass der Host des Codes nicht mehr ZendVM, sondern die CPU ist.

Warum benötigt PHP JIT?

Vor PHP 7.0 lag der Schwerpunkt der PHP-internen Community auf der Leistung, was durch einen gesunden Wettbewerb durch das HHVM-Projekt von Facebook entstanden war. Die meisten Kernänderungen in PHP 7.0 waren im PHPNG-Patch enthalten, der die Art und Weise, wie PHP Speicher und CPU in seinem Kern nutzt, erheblich verbessert hat, und seitdem ist jeder von uns gezwungen, sich auf die Leistung zu konzentrieren.

Seit PHP 7.0 gab es einige Leistungsverbesserungen, Optimierungen von HashTable (PHPs Kerndatenstrukturen), Zend VM-Spezialisierungen für bestimmte Opcodes, Compiler-Spezialisierungen für bestimmte Sequenzisierungen und laufende Verbesserungen der Optimierungskomponente von OPCache. . . Darüber hinaus gibt es so viel anderes, es ist so langweilig.

Es ist eine brutale Tatsache, dass diese Optimierungen uns nur begrenzt weiterbringen können und wir mit unserer Fähigkeit, es weiter zu verbessern, schnell näher kommen oder vielleicht an eine Mauer stoßen.

HINWEIS: Wenn wir sagen „wir können es nicht mehr verbessern“, meinen wir eigentlich: „Wir müssen Kompromisse eingehen, um es nicht mehr weiter zu verbessern.“ sieht aus wie „Attraktiv“. . . Immer wenn wir über Leistungsoptimierung sprechen, diskutieren wir Kompromisse. Oft besteht ein Kompromiss zwischen Einfachheit und Leistung. Wir alle denken gerne, dass der einfachste Code der schnellste Code ist, aber in der modernen Welt der C-Programmierung ist das nicht der Fall. Der schnellste Code ist in der Regel Code, der darauf vorbereitet ist, die Vorteile architekturabhängiger oder plattformabhängiger (Compiler-)spezifischer Funktionen zu nutzen. Einfachheit garantiert nicht die beste Leistung. . .

Derzeit scheint die JIT-Funktionalität von PHP der beste Weg zu sein, um mehr Leistung aus PHP herauszuholen.

Wird JIT meine Website schneller machen?

Möglich, nicht offensichtlich.

ist möglicherweise nicht die Antwort, die Sie erwartet haben: Im Allgemeinen funktionieren in PHP geschriebene Anwendungen I/O绑定 und JIT am besten mit CPU绑定 Code.

Was genau bedeutet „I/O- und CPU-Bindung“?

Wir verwenden die Begriffe I/O绑定 und CPU绑定, wenn wir die allgemeinen Leistungsmerkmale eines Codeabschnitts oder einer Anwendung beschreiben möchten.

Der einfachste Weg, es auszudrücken, ist:

  • Ein Stück I/O-gebundener Code, wenn wir die I/O, die er ausführt, verbessern (reduzieren, optimieren) können schneller laufen.

  • Ein Teil des CPU-gebundenen Codes wird schneller ausgeführt, wenn wir die von der CPU ausgeführten Anweisungen verbessern (reduzieren, optimieren) oder (auf magische Weise) die Taktrate der CPU erhöhen können: )

  • Ein Code oder eine Anwendung kann I/O-gebunden, CPU-gebunden oder gleichermaßen an CPU und I/O gebunden sein.

  • Im Allgemeinen neigen PHP-Anwendungen dazu, E/A-gebunden zu sein – was sie verlangsamt, ist die E/A, die sie ausführen – das Herstellen von Verbindungen, das Lesen und Schreiben von Datenbanken, Caches, Dateien, Sockets usw .

Wie sieht CPU-gebundenes PHP aus?

Aufgrund der Natur der meisten PHP-Anwendungen sind viele PHP-Programmierer nicht mit CPU-gebundenem Code vertraut – ihre Aufgabe besteht oft darin, eine Verbindung zu einer Datenbank oder vielleicht einem Cache herzustellen und einige Lightweight-Aufgaben zu erledigen gibt eine html/json/xml-Antwort aus.

Möglicherweise schauen Sie sich in der Codebasis um und finden eine Menge Code, der nichts mit I/O zu tun hat, oder sogar Code, der Funktionen aufruft, die völlig von I/O getrennt sind, und werden verwirrt, und ich scheinen zu implizieren, dass dies nicht der Fall ist. Es besteht keine Notwendigkeit, Ihre Anwendung CPU-gebunden zu machen, auch wenn es möglicherweise mehr Codezeilen gibt, die Nicht-E/A verarbeiten als E/A.

PHP ist tatsächlich ziemlich schnell, es ist eine der am schnellsten interpretierten Sprachen der Welt. Es gibt keinen signifikanten Unterschied zwischen dem Aufruf einer Funktion durch die Zend-VM, die nichts mit I/O zu tun hat, und dem Ausführen desselben Aufrufs im Maschinencode.

Es gibt offensichtlich einen Unterschied, aber Tatsache ist, dass Maschinencode eine Aufrufkonvention hat, Zend VM eine Aufrufkonvention hat, Maschinencode einen Prolog hat, Zend VM einen Prolog hat: Etwas in einem Zend-Opcode aufrufen c_level_function() oder Maschinencode hat keinen wesentlichen Einfluss auf die Leistung der aufrufenden Anwendung – obwohl er offenbar einen großen Einfluss auf diesen Aufruf hat.

Hinweis: Aufrufkonvention bezieht sich grob auf eine Reihe von Anweisungen, die vor der Eingabe einer anderen Funktion ausgeführt werden, und Prolog bezieht sich auf eine Reihe von Anweisungen, die bei Eingabe einer anderen Funktion ausgeführt werden: in In beiden Fällen , schiebt die Aufrufkonvention die Parameter auf den Stapel und der Prolog entfernt sie vom Stapel.

Was ist mit Loops, Tail Calls und X? Ich höre Sie fragen: PHP ist tatsächlich sehr intelligent, und wenn die Optimierungskomponente von OPCache aktiviert ist, ist es, als würde Ihr Code auf magische Weise in die effizienteste Form umgewandelt, die Sie schreiben können.

Nun ist es wichtig zu beachten, dass JIT die Aufrufkonvention von Zend-Funktionen nicht ändert, sondern die von der VM festgelegte – Zend muss daher jederzeit in der Lage sein, zwischen JIT- und VM-Modus zu wechseln die Entscheidung, die durch die VM Calling-Konvention festgelegte Entscheidung beizubehalten. Wenn also das JIT läuft, werden diese Anrufe überall nicht wesentlich beschleunigt.

Wenn Sie sehen möchten, wie CPU-gebundener PHP-Code aussieht, schauen Sie sich die Zend/bench.php Dokumentation an... Dies ist offensichtlich ein extremes CPU-Codebeispiel, aber es sollte uns eine Vorstellung davon geben, wo Das JIT glänzt wirklich. Es liegt auf dem Gebiet der Mathematik.

Ist PHP der ultimative Kompromiss für schnellere Mathematik?

Nein, wir haben dies getan, um den Umfang von PHP zu erweitern, und zwar um einiges.

Nach Meinung dieses sehr voreingenommenen PHP-Entwicklers machen Sie das Web falsch, wenn Sie im Jahr 2019 Webprogrammierer sind und nicht darüber nachgedacht haben, PHP in Ihrem nächsten Projekt zu verwenden.

Die Verbesserung der Fähigkeit, Mathematik in PHP schneller auszuführen, scheint auf den ersten Blick ein sehr enger Rahmen zu sein.

Dies öffnet jedoch tatsächlich die Tür zu maschinellem Lernen, 3D-Rendering, 2D-Rendering (GUI) und Datenanalyse (um nur einige zu nennen).

Warum können wir es nicht in PHP 7.4 verwenden?

Ich habe JIT gerade den „ultimativen Kompromiss“ genannt, und ich denke, dass es so ist: Es ist wohl eine der komplexesten Compiler-Strategien, die jemals entwickelt wurden, vielleicht die komplexeste. Die Einführung von JIT bringt erhebliche Komplexität mit sich.

Wenn Sie Dmitry (den Autor von JIT) fragen würden, ob er PHP komplex gemacht hat, würde er sagen: „Nein, ich hasse Komplexität“ (dies ist ein direktes Zitat).

Letztendlich verstehen wir Komplexität nicht, und derzeit gibt es nur sehr wenige interne Entwickler (weniger als ein paar), die die JIT-Implementierung wirklich verstehen.

PHP 7.4 schreitet schnell voran und die Zusammenführung mit PHP 7.4 wird uns eine Version von PHP hinterlassen, die nur wenige Leute debuggen, reparieren oder verbessern können (im wahrsten Sinne des Wortes). Für diejenigen, die gegen die Zusammenführung mit PHP 7.4 gestimmt haben, ist diese Situation inakzeptabel.

In der Zeit zwischen jetzt und PHP 8 werden viele von uns in ihrer Freizeit hart daran arbeiten, das JIT zu verstehen:

Wir müssen noch einige Funktionen implementieren und müssen überarbeitet werden php8 Um Tools zu schreiben, müssen wir zunächst JIT verstehen. Wir brauchen diese Zeit und sind äußerst dankbar, dass eine Mehrheit der Wähler es für angebracht hielt, sie uns zu schenken.

Komplexität ist kein Synonym für schrecklich:

Komplexität kann schön sein, und wie ein Nebel ist JIT diese Art von Komplexität. Im Prinzip kann man etwas Komplexes vollständig verstehen und seine scheinbare Komplexität nur geringfügig reduzieren. Mit anderen Worten: Selbst wenn es 20 interne Entwickler gäbe, die mit JIT so vertraut sind wie Dmitry, würde das nicht wirklich etwas an der Komplexität von JIT ändern.

Wird sich die PHP-Entwicklung verlangsamen?

Es gibt keinen Grund zu der Annahme, dass dies der Fall ist. Wir haben genug Zeit, um mit Zuversicht sagen zu können, dass, wenn PHP 8 allgemein verfügbar ist, genug von uns mit JIT vertraut sein werden, um mindestens genauso nützlich zu sein wie heute, wenn es um die Behebung von Fehlern und die Weiterentwicklung von PHP geht.

Wenn Sie versuchen, dies auf den Punkt zu bringen, dass JIT von Natur aus komplex ist, bedenken Sie, dass wir die meiste Zeit, die wir mit der Einführung einer neuen Funktion verbringen, tatsächlich damit verbringen, diese Funktion zu besprechen. Für die meisten Funktionen oder sogar Korrekturen kann das Schreiben des Codes Minuten oder Stunden dauern und die Diskussionen können Wochen oder Monate dauern. In seltenen Fällen kann das Schreiben des Codes für eine Funktion Stunden oder Tage dauern, aber in diesen seltenen Fällen dauern Diskussionen immer länger.

Eine detaillierte Analyse von PHP8 finden Sie unter „Graphische JIT-Erläuterung der neuen Funktionen von PHP8“ „Um wie viel Verbesserung hat sich die Leistung von PHP 8 verbessert?

Dieser Artikel wurde direkt von der chinesischen PHP-Website übersetzt: https://blog.krakjoe.ninja/2019/03/php-gr8.html

Das obige ist der detaillierte Inhalt vonUmfassende Interpretation der Optimierung und Verbesserungen der PHP8.0-Version. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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