Maison  >  Article  >  développement back-end  >  Introduction détaillée aux performances de PHP7 et HHVM (image et texte)

Introduction détaillée aux performances de PHP7 et HHVM (image et texte)

黄舟
黄舟original
2017-03-24 10:07:524394parcourir

Changements dans le classement du langage PHP

Selon le "TIOBEProgramming Language Ranking" (bien que la liste a des limites en matière de méthodes statistiques, mais cela reste une bonne référence). En 2010, PHP se classait au troisième rang des langages de programmation mondiaux. On constate que le langage PHP est le langage le plus puissant dans le domaine Web à l’ère Internet PC.        

PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

Une blague circulait parmi les programmeurs PHP : Si tout le monde commence à faire du bruit, je dînerai avec vous. ​​ ​

Programmeur PHP : PHP est le meilleur langage au monde !
Une marmite de forum, des querelles en tout genre... Une femme : prends-toi, c'est parti !
Programmeur PHP : Pas aujourd'hui, je dois les convaincre que PHP doit être le meilleur langage.


D'accord, passons aux choses sérieuses. Le langage en lui-même n'est ni bon ni mauvais, il résout simplement différents problèmes dans les scénarios dans lesquels il est utilisé. L’ère Internet évolue très vite avec l’arrivée de l’Internet mobile, en peu de temps. En plus de quatre ans, le développement de la technologie mobile a balayé le monde. Dans le même temps, divers langages émergent, et PHP, autrefois glorieux, est tombé à la sixième place de la liste originale des langages de programmation (liste de décembre 2014). un). En conséquence, des voix dénigrant PHP ont émergé les unes après les autres.

       PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

Cependant, frère Niao (Hui Xinchen, l'un des développeurs du langage PHP) a partagé une donnée sur Qcon en 2014. Parmi les 1 million de sites Web les plus performants au monde, 81,3 % font Le langage de script de serveur Web utilisé est PHP, qui représentait 78,3 % sur la même période de 2013. En d’autres termes, PHP n’a pas diminué en termes de services Web, mais a beaucoup augmenté dans la vague Internet mobile. L’application d’autres technologies linguistiques est ainsi diluée.

Récemment, la comparaison des performances entre PHP7 et HHVM est devenue un sujet brûlant et controversé. Tout le monde discute et prête attention à l'avenir de l'amélioration des performances PHP.

L'origine de HHVM (HipHop Virtual Machine)

HHVM est une machine virtuelle PHP open source qui utilise de manière significative la compilation JIT et d'autres technologies. améliorer les performances d'exécution du

code PHP

. Selon la rumeur, les performances d'exécution de la version actuelle du code PHP natif pourraient être améliorées de 5 à 10 fois. HHVM provient de Facebook. La plupart des premiers codes de Facebook ont ​​été développés en utilisant PHP. Cependant, avec le développement rapide des affaires, PHP a été mis en œuvre. L’efficacité opérationnelle est devenue un problème de plus en plus évident. Afin d'optimiser l'efficacité de l'exécution, Facebook a commencé à utiliser HipHop en 2008, un moteur d'exécution PHP initialement conçu pour cela. Convertissez une grande quantité de code PHP Facebook en                             C++ pour améliorer les performances et économiser les ressources. Les performances du code PHP utilisant HipHop ont été améliorées plusieurs fois. Plus tard, Facebook a ouvert la plateforme HipHop et l'a progressivement développée pour devenir l'actuelle HHVM.

1. Pourquoi PHP est-il lent ?

                                                                    

PHP est plus lent que les langages de niveau C/C++. En fait, le langage PHP n'a pas été conçu à l'origine pour résoudre des scénarios d'application gourmands en calcul. On peut grossièrement comprendre que PHP sacrifie l'efficacité d'exécution afin d'améliorer l'efficacité du développement.

Nous savons qu'une fonctionnalité importante de PHP est la fonctionnalité de type faible. En d'autres termes, je peux définir une variable à volonté, puis l'attribuer à n'importe laquelle. valeur à volonté. En prenant comme exemple un nombre entier entier, en langage C  :

int num = 200;//通常是4字节

Cependant, si PHP définit la même variable, la structure de stockage correspondante réelle est :


                                                                                                                                              La mémoire avec beaucoup plus de variables est définie en PHP comme suit :

Dans En fait, pour PHP, quel que soit le type de données stockées, le "pass kill" mentionné ci-dessus est utilisé. Implémentation de la structure. Afin d'être compatible avec la variable de type "intrusion" des programmeurs PHP, PHP fait C'est convivial pour les développeurs, mais cruel pour le moteur d'exécution. La consommation de mémoire d'une seule variable n'est peut-être pas encore évidente. Une fois le tableau

etc. de PHP utilisé, la complexité augmente de façon exponentielle (l'implémentation du tableau est HashTable). Ensuite, lorsque le moteur Zend s'exécute, ces codes PHP sont compilés en opcode (le bytecode intermédiaire de PHP, le format est quelque peu similaire à l'assembly), qui est traité ligne par ligne par le moteur Zend. Explication et exécution.
$a = 200;//这变量将实际占用对比C变量很多倍的存储空间。

Qu'il s'agisse de l'opération de connexion de chaîne ou de la simple modification du tableau, etc., ils sont presque tous "un mot d'un programmeur PHP, et le moteur Zend va se casser les jambes" Rhythm. Par conséquent, pour la même opération, PHP consomme plus de ressources système telles que le CPU et la mémoire que C. De plus, il existe un recyclage automatique de la mémoire, un jugement de type variable, etc., qui augmenteront la consommation des ressources système.

Par exemple, j'ai utilisé la fonction de tri rapide et la fonction de tri native implémentée en PHP pur pour trier 10 000 nombres entiers afin de faire une comparaison fastidieuse. Les résultats sont les suivants :

PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者Le tri natif prend 3,44 ms, tandis que notre propre implémentation de la fonction PHP
le tri prend 68,79 MS. Nous avons constaté qu’il existe un énorme écart en termes d’efficacité d’exécution entre les deux. Ma méthode de test consiste à calculer l'intervalle de temps avant et après l'exécution de la fonction, plutôt que le temps du début à la fin de l'ensemble du script PHP. Script PHP pour démarrer et arrêter également Le processus lui-même comporte une série de travaux d'initialisation et de nettoyage, qui prennent également beaucoup de temps.                                                                                              

       

       

                                                                                     PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者

Habituellement, le classement de l'efficacité d'exécution de PHP est :

                 

Les plus rapides sont les structures du langage PHP (isset, echo, etc.), qui font partie du langage PHP (ce ne sont pas du tout des fonctions).

Ensuite, les plus rapides sont les fonctions natives et étendues de PHP. L'extension PHP, basée sur l'API Zend, implémente des fonctions en C, et son efficacité d'exécution est du même ordre de grandeur que C++/Java.

  • Ce qui est vraiment lent, c'est le code et les fonctions que nous écrivons nous-mêmes via PHP. Par exemple, si nous utilisons un framework relativement lourd implémenté en PHP pur, parce que le framework lui-même comporte de nombreux modules, il réduira évidemment l'efficacité d'exécution au niveau du langage et occupera plus de mémoire. (Le framework Yaf domestique est implémenté de manière étendue, donc l'efficacité d'exécution est beaucoup plus rapide que le framework écrit en PHP pur)

  •                          

    PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者
           

    Dans des circonstances normales, nous ne recommandons pas d'utiliser PHP pour implémenter des fonctions de calcul logique complexes, en particulier dans les scénarios où le trafic du système Web est relativement important. Par conséquent, les programmeurs PHP devraient Avoir une compréhension relativement large des différentes fonctions natives et des diverses extensions de PHP. Dans des scénarios d'implémentation de fonctions spécifiques, recherchez des solutions plus natives ( interface native ou extensions) au lieu d'en écrire une vous-même. Code PHP pour implémenter ce type de fonctionnalité.

    Si vous disposez de suffisamment de capacités de développement d'extensions PHP, la réécriture de ce type de fonction métier en tant qu'extension PHP améliorera également considérablement l'efficacité de l'exécution du code. C'est une très bonne méthode et elle est également largement utilisée dans l'optimisation PHP. Cependant, les lacunes du développement commercial PHP auto-écrit sont également évidentes :

    1. Le développement d'une extension prend beaucoup de temps et les modifications sont compliquées lorsque les exigences changent, et il est difficile à écrire. Cela peut affecter la stabilité des services Web. (Par exemple, dans le mode travailleur d'Apache, s'il se bloque dans un scénario multithread, cela affectera d'autres sous-threads normaux dans le même processus. S'il s'agit d'un mode Web multithread, l'écriture d'extensions doit également prendre en charge le thread sécurité )

    2. Lorsque la version PHP est mise à niveau, l'extension devra peut-être effectuer un travail de compatibilité supplémentaire.

    3. Les coûts de maintenance et de reprise après changement de personnel sont également relativement élevés.

    En fait, parmi les sociétés Internet de première ligne, la solution la plus courante n'est pas d'ajouter des extensions PHP, mais d'utiliser C/ C++ Écrivez indépendamment un serveur de service, puis PHP communique avec le serveur de service via un socket pour terminer le traitement métier, sans coupler PHP lui-même avec l'entreprise.

    Cependant, la plupart des goulots d'étranglement des performances des services Web résident dans le temps de transmission réseau et d'autres serveurs de services (tels que MySQL, etc.), et la consommation de temps d'exécution de PHP La proportion globale de consommation de temps est très faible, donc d'un point de vue commercial, l'impact peut ne pas être évident.

    2. La façon dont HHVM améliore les performances d'exécution de PHP                        Remplace le moteur Zend pour générer et exécuter le bytecode intermédiaire de PHP (HHVM génère son propre format de bytecode intermédiaire code), exécuté via JIT (juste                            

    Time

    , la compilation juste à temps est une technologie d'optimisation logicielle, ce qui signifie que le bytecode est compilé en code machine au moment de l'exécution) et converti en code machine pour son exécution. La méthode par défaut du moteur Zend consiste à le compiler d'abord en opcode, puis à le compiler un par un. Exécution, généralement chaque instruction correspond à une fonction de niveau langage C. Si nous générons un grand nombre d’opcodes répétés (codes et fonctions écrits en PHP pur), Zend exécutera ces codes C un par un plusieurs fois. code. Ce que fait JIT, c'est aller plus loin et compiler un grand nombre de bytecodes exécutés à plusieurs reprises dans le code machine au moment de l'exécution pour améliorer l'efficacité de l'exécution. Habituellement, la condition qui déclenche JIT est que le code ou la fonction est appels répétés.        

                                                                        PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者
                                                                                    

    Code PHP ordinaire, car le type de la variable ne peut pas être corrigé, un code logique supplémentaire pour déterminer le type doit être ajouté, un tel code PHP n'est pas propice à l'exécution et à l'optimisation du processeur de. Par conséquent, HHVM a généralement besoin d'utiliser du code PHP avec la méthode d'écriture Hack (code technique supplémentaire ajouté pour être compatible avec certaines fonctionnalités) pour "coopérer", afin de fixer le type de variable et de faciliter la virtualisation. Machine compilée et exécutée. PHP cherche à accueillir tous les types sous une seule forme, tandis que Hack peut marquer tout ce qui est hébergé avec un certain type.

    Exemple de méthode d'écriture Hack de code PHP :                                                                                                                                                                                                                                                                                                              ​ ​ ​ ​  

    Dans l'exemple ci-dessus, le code PHP est principalement ajouté avec des types de variables. La direction générale de l'écriture Hack est de changer la méthode d'écriture "dynamique" précédente en méthode d'écriture "

    statique

    " pour coopérer avec HHVM. PHP7和HHVM的性能之争介绍 - 徐汉彬Hansion - 技术行者
    HHVM a attiré beaucoup d'attention en raison de ses hautes performances, et certaines sociétés Internet de premier plan ont également commencé à emboîter le pas. À en juger par les résultats des tests de performances d'exécution du langage pur, HHVM est bien en avance sur la version PHP7 en cours de développement.

    , l'écart entre HHVM et PHP7 n'est pas si grand dans les résultats du scénario de test utilisant la page d'accueil du blog open source WordPress, leur actuelle. l'écart n'est pas évident.                                                                                                                                                                                                          ​ ​ ​  

    Cependant, PHP7 est encore en développement. À en juger par les solutions techniques disponibles, le HHVM actuel est légèrement meilleur. Cependant, il existe quelques problèmes dans le déploiement et l'application de HHVM :

    Le déploiement du service est compliqué et entraîne certains coûts de maintenance.
    ne prend pas entièrement en charge le code natif PHP, et les extensions PHP doivent également être correctement compatibles.


    HHVM est une nouvelle machine virtuelle et peut provoquer des fuites de mémoire lors d'une exécution prolongée. (On dit que lorsque les sociétés Internet de premier plan appliquent cette technologie, elles résolvent les fuites de mémoire en appliquant elles-mêmes des correctifs)

                           Pour un projet open source relativement nouveau, il faut encore un certain temps pour mûrir.
    Innovation en termes de performances de PHP7

    Les problèmes de performances pour lesquels PHP a longtemps été critiqué seront grandement améliorés dans cette version. Il n'y a pas de PHP6 dans la version. On dit que cette version a un projet, et plus tard la plupart des fonctions ont été implémentées dans la version 5.x. Afin d'éviter toute confusion, la prochaine version majeure sera directement PHP7. (Il y a quelques années, j'ai aussi vu des livres sur PHP6.)

    1. Introduction à PHP7
    1.                                                >

      Bien que officiel La version de PHP7 pourrait ne pas être publiée avant octobre 2015, une version de test devrait être disponible en juin de l'année prochaine, suivie de 3 à 4 mois d'assurance qualité.

    2. Le plan de projet de la communauté PHP est le suivant :       


                                                                                                                                                                         

      Parce que le projet est encore en développement depuis le 🎜>tableau

      , les descriptions des fonctionnalités visibles sont relativement vague. Il y a certainement d'autres fonctionnalités, mais elles n'ont tout simplement pas encore été annoncées. Ce qui suit provient de la communauté PHP. Parce que PHP7 est un projet en cours de développement, ce qui suit peut ne pas être exact, mais cela ne nous empêche pas d'y jeter un œil.
      1. PHPNG (PHP nouvelle génération, nouvelle génération PHP), diverses optimisations de performances pour le moteur d'exécution Zend lui-même, y compris JIT, peuvent être implémentées dans Zend                                                         Dans le composant Opcache.
      2. AST (Abstract Syntax Tree, arbre de syntaxe abstraite) est conçu pour introduire un middleware dans le processus de compilation PHP pour remplacer la façon de cracher l'opcode directement à partir du interprète. Le découplage de l'interpréteur et du compilateur peut réduire beaucoup de code Hack et, en même temps, rendre l'implémentation plus facile à comprendre et à maintenir.
      3. la syntaxe de variable uniforme introduit une syntaxe de variable cohérente et complète en interne, permettant à l'analyseur PHP de prendre en charge plus pleinement divers types de variables. L'utilisation de certaines variables doit être ajustée, comme la variable $$a, etc.
      4. Prend en charge la sémantique entière (sémantique entière), telle que NaN, Infinity, 071af19a55f4da1989e8c02b755ba052>, corrige la cohérence de list(), etc. attendez.

      Parmi les fonctionnalités ci-dessus, la plus attendue est l'optimisation des performances de PHPng. La communauté PHP a publié des données de tests de vitesse de performances. Du point de vue des données, PHPng La performance d'exécution a été presque doublée par rapport au début du projet. Ce résultat est déjà très bon. De plus, le plus important est qu'il existe encore de nombreux plans d'optimisation pour PHP7 qui ne sont pas encore terminés. Attendez que tout soit terminé, Je crois que nous pouvons voir un PHP7 plus performant.

      Ces données de test de vitesse proviennent de la communauté PHP (wiki.php.net/phpng) et interceptent une partie des données :


                                                                                                                 🎜>


                                                                          

                   

      Traduction simple :

                                              

      La vitesse du test complet est augmentée de 35 %.

      • Dans les scénarios d'application réels, il y a une augmentation de la vitesse de 20 à 70 % (la page d'accueil WordPress a une amélioration de 60 %)

      • Moins de consommation de mémoire

      • Prend en charge les SAPI les plus couramment utilisés

      • Prend en charge la plupart des extensions PHP liées à l'allocation de ressources (69 terminées, 6 à migrer)

      • Fournit une vitesse d'exécution comparable à HHVM3.3.0

      •                             ​ ​ ​  

      2. La controverse sur les types faibles de PHP                                                                     

                                                                                      

      PHP possède de nombreuses fonctionnalités controversées, mais avec la sortie et l'amélioration de la version linguistique, les critiques sur les fonctions et les fonctionnalités ont commencé à diminuer. Cependant, la fonctionnalité "type faible" de PHP a évidemment été plus controversée. Du fait que HHVM a directement "supprimé" la fonctionnalité "type faible" via Hack, on peut voir que HHVM n'aime pas la fonctionnalité "type faible". Cependant, dans bon nombre de nos Aux yeux des programmeurs PHP, c’est l’un des avantages importants de PHP. Les variables en PHP sont conçues pour être décontractées et élégantes, englobant tout. Cela ne simplifie-t-il pas le langage ?

      ​ ​ ​  

      En fait, certains pensent qu'il s'agit d'un problème sérieux, et la critique de la « frappe faible » est à peu près la suivante :

                                  ​ ​ ​ ​  

      1. Dans un langage "strict", le type d'une variable est généralement prédéfini Du début à la fin, le type de la variable est fixe. , et le champ d'utilisation est également fixé. Quant à la variable de PHP , nous ne pouvons généralement voir que son nom, et la plupart des types ne peuvent pas être prédéfinis et peuvent être modifiés à volonté. (L'allocation de mémoire n'est pas facile à gérer)

      2. Afin d'être compatible avec les fonctionnalités de type faibles, PHP doit implémenter une grande quantité de code compatible, y compris le type le jugement, la conversion de type , les méthodes de stockage, etc., augmentent la complexité interne du langage. (Faible efficacité d'exécution)

      3. Le type de la variable est incontrôlable Il y a beaucoup de "conversions de type implicites" pendant le processus d'exécution, ce qui peut facilement conduire. à un résultat imprévisible. (Il faut souligner ici que la conversion de types PHP est un point qui doit être maîtrisé. La conversion de différents types entre eux peut poser de nombreux problèmes, en particulier pour les étudiants qui débutent en PHP)

                                  ​ ​ ​    

      Ils pensent que ceux-ci ne sont pas conformes à la simplicité du « ce que vous voyez est ce que vous obtenez », et que les langues avec une grammaire stricte sont plus efficaces et plus facile à « comprendre ».

                   

      Des langages tels que  Javascript ont été également critiqués, car leurs performances sur cette question sont les mêmes. Cependant, pour qu'une langue puisse éventuellement être utilisée à grande échelle, elle doit Il y a des raisons à cela. PHP est devenu le langage de script de choix pour le développement de services Web, et Javascript a directement dominé le domaine du front-end Web. Ce n'est pas un hasard si nous en sommes arrivés à ce point. Les pieds ont voté pour eux. Le langage de programmation est un pont entre les humains et les machines, et l’objectif ultime est d’atteindre le grand objectif de « tout le monde peut programmer ».

      ​ ​ ​  

      Tout au long de l'histoire du développement des langages, depuis le code machine des 0 et des 1, jusqu'au langage assembleur, puis au langage C, puis au langage de script dynamique PHP. L'efficacité d'exécution diminue de façon exponentielle, mais le seuil d'apprentissage diminue également de façon exponentielle. Le langage PHP protège non seulement la complexité de la gestion de la mémoire et des pointeurs du C, mais protège également davantage la complexité des types de variables. Cela améliore l’efficacité du développement du projet et abaisse le seuil d’apprentissage, mais sacrifie en même temps une certaine quantité de performances d’exécution. Ensuite, le Hack de HHVM nous donne une sensation de « retour au primitif », réintroduisant la complexité des variables. Bien entendu, différents langages résolvent des problèmes dans différents scénarios et ne peuvent pas être généralisés.

                                                                                                                                                                         

                                                                                                                                                                                                                  . Les deux sont d’excellents projets open source et tous deux s’améliorent constamment Avancer et se développer. Pour l’instant, comme il reste encore beaucoup de temps avant la sortie de la version officielle de PHP7, le choix actuel de solution d’optimisation des performances est bien entendu HHVM. Mais personnellement, je préfère Je suis optimiste quant à PHP7 car il est plus rétrocompatible avec le code PHP. S’il n’y a pas beaucoup de différence de performances entre les deux, je choisirai le plus simple.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn