Heim Backend-Entwicklung PHP-Tutorial Baidu-Ingenieure sprechen über die Implementierungsprinzipien und Leistungsanalyse von PHP-Funktionen (1)

Baidu-Ingenieure sprechen über die Implementierungsprinzipien und Leistungsanalyse von PHP-Funktionen (1)

Aug 08, 2016 am 09:24 AM
function php struct type zend

Baidu-Ingenieure sprechen über die Implementierungsprinzipien und Leistungsanalyse von PHP-Funktionen (1)

Vorwort
In jeder Sprache sind Funktionen die grundlegendsten Bausteine. Was sind die Merkmale von PHP-Funktionen? Wie wird der Funktionsaufruf implementiert? Wie ist die Leistung von PHP-Funktionen? Gibt es Vorschläge zur Verwendung? In diesem Artikel werden die Prinzipien analysiert und mit tatsächlichen Leistungstests kombiniert, um zu versuchen, diese Fragen zu beantworten und PHP-Programme besser zu schreiben und gleichzeitig die Implementierung zu verstehen. Gleichzeitig werden einige gängige PHP-Funktionen vorgestellt.
Klassifizierung von PHP-Funktionen
In PHP werden Funktionen bei horizontaler Aufteilung in zwei Kategorien unterteilt: Benutzerfunktion (integrierte Funktion) und interne Funktion (integrierte Funktion). Ersteres sind einige Funktionen und Methoden, die vom Benutzer im Programm angepasst wurden, und letzteres sind verschiedene Bibliotheksfunktionen, die von PHP selbst bereitgestellt werden (z. B. Sprintf, Array_Push usw.). Benutzer können Bibliotheksfunktionen auch über Erweiterungsmethoden schreiben, die später vorgestellt werden. Die Benutzerfunktion kann in Funktion (Funktion) und Methode (Klassenmethode) unterteilt werden. In diesem Artikel werden diese drei Funktionen analysiert und getestet.
Implementierung der PHP-Funktion
Wie wird eine PHP-Funktion letztendlich ausgeführt? Wie sieht der Prozess aus?
Um diese Frage zu beantworten, werfen wir zunächst einen Blick auf den Prozess der Ausführung des PHP-Codes.

Wie Sie in Abbildung 1 sehen können, implementiert PHP einen typischen dynamischen Sprachausführungsprozess: Nach Erhalt eines Codeabschnitts, nach lexikalischer Analyse, Syntaxanalyse und anderen Phasen wird das Quellprogramm übersetzt a-Anweisungen (Opcodes), und dann führt die virtuelle ZEND-Maschine diese Anweisungen nacheinander aus, um den Vorgang abzuschließen. PHP selbst ist in C implementiert, daher sind die letztendlich aufgerufenen Funktionen alle C-Funktionen. Tatsächlich können wir PHP als eine in C entwickelte Software betrachten. Aus der obigen Beschreibung ist nicht schwer zu erkennen, dass die Ausführung von Funktionen in PHP auch in Opcodes zum Aufruf übersetzt wird. Jeder Funktionsaufruf führt tatsächlich eine oder mehrere Anweisungen aus.
Zend beschreibt jede Funktion durch die folgende Datenstruktur
typedef union _zend_function { zend_uchar type; /* MUST be the first element of this struct! */ struct { zend_uchar type; /* never used */ char *function_name; zend_class_entry *scope; zend_uint fn_flags; union _zend_function *prototype; zend_uint num_args; zend_uint required_num_args; zend_arg_info *arg_info; zend_bool pass_rest_by_reference; unsigned char return_reference; } common; zend_op_array op_array; zend_internal_function internal_function; } zend_function; typedef struct _zend_function_state { HashTable *function_symbol_table; zend_function *function; void *reserved[ZEND_MAX_RESERVED_RESOURCES]; } zend_function_state;
wobei Typ den Typ der Funktion angibt: Benutzerfunktion, integrierte Funktion, überladene Funktion. Common enthält die grundlegenden Informationen der Funktion, einschließlich Funktionsname, Parameterinformationen, Funktionsflags (normale Funktionen, statische Methoden, abstrakte Methoden) usw. Darüber hinaus gibt es für Benutzerfunktionen auch eine Funktionssymboltabelle, in der interne Variablen usw. aufgezeichnet werden, die später ausführlich beschrieben werden. Zend verwaltet eine globale function_table, eine große Hash-Tabelle. Wenn eine Funktion aufgerufen wird, wird die entsprechende zend_function zunächst anhand des Funktionsnamens aus der Tabelle gefunden. Bei einem Funktionsaufruf bestimmt die virtuelle Maschine die aufrufende Methode anhand des Typs. Verschiedene Funktionstypen haben unterschiedliche Ausführungsprinzipien.
Eingebaute Funktionen
Eingebaute Funktionen sind im Wesentlichen echte C-Funktionen. Nach der endgültigen Kompilierung wird PHP in eine Funktion mit dem Namen zif_xxxx erweitert. Unser gemeinsamer Sprintf entspricht beispielsweise der untersten Ebene . zif_sprintf. Wenn Zend bei der Ausführung eine integrierte Funktion findet, führt es einfach eine Weiterleitungsoperation durch.
Zend bietet eine Reihe von APIs zum Aufrufen, einschließlich Parametererfassung, Array-Operationen, Speicherzuweisung usw. Die Parameter der integrierten Funktion werden über die Methode zend_parse_parameters abgerufen. Für Parameter wie Arrays und Zeichenfolgen implementiert Zend flaches Kopieren, sodass diese Effizienz sehr hoch ist. Man kann sagen, dass die Effizienz der in PHP integrierten Funktionen nahezu mit der der entsprechenden C-Funktionen übereinstimmt, mit dem einzigen zusätzlichen Weiterleitungsaufruf.
Eingebaute Funktionen werden in PHP dynamisch geladen, sodass Benutzer entsprechend ihren Anforderungen auch entsprechende schreiben können, was wir oft als Erweiterungen bezeichnen. ZEND bietet eine Reihe von APIs zur Erweiterung
Benutzerfunktionen
Im Vergleich zu integrierten Funktionen haben benutzerdefinierte Funktionen, die über PHP implementiert werden, völlig andere Ausführungsprozesse und Implementierungsprinzipien. Wie oben erwähnt, wissen wir, dass PHP-Code zur Ausführung in Opcodes übersetzt wird und Benutzerfunktionen keine Ausnahme bilden. Tatsächlich entspricht jede Funktion einem Satz Opcodes, und dieser Satz Anweisungen wird in zend_function gespeichert. Daher entspricht der Aufruf der Benutzerfunktion letztendlich der Ausführung einer Reihe von Opcodes.
》》Speichern lokaler Variablen und Implementierung der Rekursion
Wir wissen, dass die Funktionsrekursion über den Stapel abgeschlossen wird. In PHP wird dazu eine ähnliche Methode verwendet. Zend weist jeder PHP-Funktion eine aktive Symboltabelle (active_sym_table) zu, um den Status aller lokalen Variablen in der aktuellen Funktion aufzuzeichnen. Alle Symboltabellen werden in Form eines Stapels verwaltet. Bei jedem Aufruf einer Funktion wird eine neue Symboltabelle zugewiesen und auf den Stapel verschoben. Wenn der Aufruf endet, wird die aktuelle Symboltabelle vom Stapel entfernt. Dadurch werden Zustandserhaltung und Rekursion erreicht.
Für die Stack-Wartung hat Zend es hier optimiert. Weisen Sie vorab ein statisches Array der Länge N zu, um den Stapel zu simulieren. Diese Methode wird auch häufig in unseren eigenen Programmen verwendet. Diese Methode vermeidet die durch jeden Aufruf verursachte Speicherzuweisung. ZEND bereinigt am Ende des Funktionsaufrufs lediglich die Symboltabellendaten oben im aktuellen Stapel. Da die Länge des statischen Arrays N beträgt, verursacht das Programm keinen Stapelüberlauf, sobald die Funktionsaufrufebene N überschreitet. In diesem Fall weist zend die Symboltabelle zu und zerstört sie, was zu erheblichen Leistungseinbußen führt. In Zend beträgt der aktuelle Wert von N 32.Wenn wir PHP-Programme schreiben, ist es daher am besten, 32 Funktionsaufrufebenen nicht zu überschreiten. Wenn es sich um eine Webanwendung handelt, kann die Funktionsaufrufebene selbst natürlich tiefgreifend sein.
》》Die Übergabe von Parametern unterscheidet sich von der integrierten Funktion, die zend_parse_params aufruft, um Parameter abzurufen. Die Erfassung von Parametern in Benutzerfunktionen erfolgt über Anweisungen. Die Anzahl der Parameter einer Funktion entspricht der Anzahl der Anweisungen. Spezifisch für die Implementierung handelt es sich um eine gewöhnliche Variablenzuweisung. Aus der obigen Analyse ist ersichtlich, dass die Leistung der Benutzerfunktion im Vergleich zu den integrierten Funktionen relativ viel schlechter ist, da die Stapeltabelle selbst verwaltet wird und die Ausführung jeder Anweisung auch eine C-Funktion ist . Es wird später eine spezifische vergleichende Analyse geben. Wenn eine Funktion über eine entsprechende integrierte PHP-Funktion verfügt, versuchen Sie daher, die Funktion nicht selbst neu zu schreiben, um sie zu implementieren.

Referenzquelle:
Baidu-Ingenieure sprechen über die Implementierungsprinzipien und Leistungsanalyse von PHP-Funktionen (1)
http://www.lai18.com/content/410091.html

Das Obige stellt die von Baidu-Ingenieuren erläuterten Implementierungsprinzipien und Leistungsanalysen von PHP-Funktionen vor (1), einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian PHP 8.4 Installations- und Upgrade-Anleitung für Ubuntu und Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 bringt mehrere neue Funktionen, Sicherheitsverbesserungen und Leistungsverbesserungen mit einer beträchtlichen Menge an veralteten und entfernten Funktionen. In dieser Anleitung wird erklärt, wie Sie PHP 8.4 installieren oder auf PHP 8.4 auf Ubuntu, Debian oder deren Derivaten aktualisieren. Obwohl es möglich ist, PHP aus dem Quellcode zu kompilieren, ist die Installation aus einem APT-Repository wie unten erläutert oft schneller und sicherer, da diese Repositorys in Zukunft die neuesten Fehlerbehebungen und Sicherheitsupdates bereitstellen.

7 PHP-Funktionen, die ich leider vorher nicht kannte 7 PHP-Funktionen, die ich leider vorher nicht kannte Nov 13, 2024 am 09:42 AM

Wenn Sie ein erfahrener PHP-Entwickler sind, haben Sie möglicherweise das Gefühl, dass Sie dort waren und dies bereits getan haben. Sie haben eine beträchtliche Anzahl von Anwendungen entwickelt, Millionen von Codezeilen debuggt und eine Reihe von Skripten optimiert, um op zu erreichen

So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein So richten Sie Visual Studio-Code (VS-Code) für die PHP-Entwicklung ein Dec 20, 2024 am 11:31 AM

Visual Studio Code, auch bekannt als VS Code, ist ein kostenloser Quellcode-Editor – oder eine integrierte Entwicklungsumgebung (IDE) –, die für alle gängigen Betriebssysteme verfügbar ist. Mit einer großen Sammlung von Erweiterungen für viele Programmiersprachen kann VS Code c

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie analysiert und verarbeitet man HTML/XML in PHP? Wie analysiert und verarbeitet man HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

Dieses Tutorial zeigt, wie XML -Dokumente mit PHP effizient verarbeitet werden. XML (Extensible Markup-Sprache) ist eine vielseitige textbasierte Markup-Sprache, die sowohl für die Lesbarkeit des Menschen als auch für die Analyse von Maschinen entwickelt wurde. Es wird üblicherweise für die Datenspeicherung ein verwendet und wird häufig verwendet

PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge PHP -Programm zum Zählen von Vokalen in einer Zeichenfolge Feb 07, 2025 pm 12:12 PM

Eine Zeichenfolge ist eine Folge von Zeichen, einschließlich Buchstaben, Zahlen und Symbolen. In diesem Tutorial wird lernen, wie Sie die Anzahl der Vokale in einer bestimmten Zeichenfolge in PHP unter Verwendung verschiedener Methoden berechnen. Die Vokale auf Englisch sind a, e, i, o, u und sie können Großbuchstaben oder Kleinbuchstaben sein. Was ist ein Vokal? Vokale sind alphabetische Zeichen, die eine spezifische Aussprache darstellen. Es gibt fünf Vokale in Englisch, einschließlich Großbuchstaben und Kleinbuchstaben: a, e, ich, o, u Beispiel 1 Eingabe: String = "TutorialPoint" Ausgabe: 6 erklären Die Vokale in der String "TutorialPoint" sind u, o, i, a, o, ich. Insgesamt gibt es 6 Yuan

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Was sind PHP Magic -Methoden (__construct, __Destruct, __call, __get, __set usw.) und geben Sie Anwendungsfälle an? Apr 03, 2025 am 12:03 AM

Was sind die magischen Methoden von PHP? Zu den magischen Methoden von PHP gehören: 1. \ _ \ _ Konstrukt, verwendet, um Objekte zu initialisieren; 2. \ _ \ _ Destruct, verwendet zur Reinigung von Ressourcen; 3. \ _ \ _ Call, behandeln Sie nicht existierende Methodenaufrufe; 4. \ _ \ _ GET, Implementieren Sie den dynamischen Attributzugriff; 5. \ _ \ _ Setzen Sie dynamische Attributeinstellungen. Diese Methoden werden in bestimmten Situationen automatisch aufgerufen, wodurch die Code -Flexibilität und -Effizienz verbessert werden.

See all articles