Maison > Article > développement back-end > Regardez la bataille de performances entre PHP7 et HHVM
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 à lequel. C'est mieux. C'est l'avenir de l'amélioration des performances PHP.
HHVM est une machine virtuelle PHP open source qui utilise la compilation JIT et d'autres technologies pour améliorer considérablement 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 est originaire de Facebook. La plupart des premiers codes de Facebook ont été développés en utilisant PHP. Cependant, avec le développement rapide de l'entreprise, l'efficacité de l'exécution de PHP 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 conçu à l'origine pour convertir la grande quantité de code PHP de Facebook en C++ afin d'améliorer les performances et d'économiser des ressources. Les performances du code PHP utilisant HipHop ont été améliorées plusieurs fois. Plus tard, Facebook a ouvert la plate-forme HipHop et l'a progressivement développée pour devenir le HHVM actuel.
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, c'est-à-dire que je peux définir une variable à volonté, puis l'attribuer à différents types de données à volonté. Prenons l'exemple d'un nombre entier int, en langage C :
int num = 200; // Généralement 4 octets
Cependant, si PHP définit la même variable, la structure de stockage correspondante est :
Cette structure occupera beaucoup plus de mémoire que les variables C. Elle est définie en PHP comme suit :
$a = 200;//Cette variable. occupera en fait plusieurs fois l'espace de stockage par rapport à la variable C.
En fait, pour PHP, quel que soit le type de données stockées, elles sont implémentées en utilisant la structure "killing" mentionnée ci-dessus. Afin d'être compatible avec le type de variable "intrusion" des programmeurs PHP, PHP a été 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 les tableaux PHP utilisés, la complexité augmente de façon exponentielle (l'implémentation des tableaux est HashTable). Ensuite, lorsque le moteur Zend est exécuté, ces codes PHP sont compilés en opcode (le bytecode intermédiaire de PHP, le format est quelque peu similaire à l'assembly), qui est interprété et exécuté ligne par ligne par le moteur Zend.
Qu'il s'agisse de l'opération de connexion de chaînes ou de la simple modification de tableaux, etc., c'est presque le rythme de "un mot d'un programmeur PHP, et le moteur Zend va tomber en panne". 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 chronophage. Les résultats sont les suivants :
<.>
Le tri natif prend 3,44 ms, tandis que la fonction PHP que nous avons implémentée prend 68,79 ms. Nous avons constaté qu’il existe un énorme écart en termes d’efficacité d’exécution entre les deux. Ma façon de tester consiste à calculer l'intervalle de temps avant et après l'exécution de la fonction, et non le temps écoulé entre le début et la fin de l'ensemble du script PHP. Le processus de démarrage et d'arrêt du script PHP lui-même implique une série de travaux d'initialisation et de nettoyage, qui prennent également beaucoup de temps.Habituellement, le classement de l'efficacité d'exécution de PHP est :
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 doivent avoir une compréhension relativement large des diverses fonctions natives et des diverses extensions de PHP. Dans des scénarios d'implémentation de fonctions spécifiques, recherchez des solutions plus natives (interfaces ou extensions natives) au lieu d'en écrire une par eux-mêmes. 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 inconvénients du développement commercial PHP auto-écrit sont également évidents :
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'écrire un serveur de service indépendamment en C/C++, puis PHP communique avec le serveur de service via des sockets. Le traitement métier ne couple pas PHP lui-même avec l'entreprise.
Cependant, la plupart des goulots d'étranglement en termes de performances des services Web résident dans le temps de transmission réseau et d'autres serveurs de services (tels que MySQL, etc.). Le temps d'exécution de PHP représente une très petite proportion de celui-ci. le temps global prend, 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
La façon dont HHVM améliore les performances de PHP est de remplacer le moteur Zend pour générer et exécuter des PHP. bytecode intermédiaire (HHVM génère son propre format de bytecode intermédiaire) et exécutez-le via JIT (Just In Time, Just In Time Compilation est une technologie d'optimisation logicielle, qui fait référence au bytecode sera compilé en code machine au moment de l'exécution) et converti en code machine pour exécution. L'approche par défaut du moteur Zend consiste d'abord à le compiler en opcode, puis à l'exécuter une par une. Habituellement, 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. 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 le JIT est que le code ou la fonction est appelé plusieurs fois.
Code PHP ordinaire, car le type de la variable ne peut pas être fixé, un code logique supplémentaire pour déterminer le type doit être ajouté. Ce code PHP n'est pas propice à l'exécution du processeur. et optimisation. 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 corriger le type de variable et de faciliter la compilation et l'exécution de la machine virtuelle. 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.
Exemples d'écriture Hack de code PHP :
L'exemple ci-dessus , le code PHP est principalement ajouté avec des types de variables. L'orientation générale de l'écriture Hack est de changer la méthode d'écriture « dynamique » précédente en une méthode d'écriture « statique » pour coopérer avec HHVM.
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.
Cependant, du point de vue de scénarios commerciaux spécifiques, l'écart entre HHVM et PHP7 n'est pas si grand En utilisant la page d'accueil du blog open source WordPress comme scénario de test, l'actuel. l'écart entre eux 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 :
Après tout, HHVM est un projet open source relativement nouveau. Il lui faut encore du temps pour mûrir.
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 au milieu de 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 lu des livres sur PHP6.)
1 Introduction à PHP7
Bien que la version officielle de PHP7 soit. ne sortira peut-être pas avant octobre 2015, mais une version test devrait être disponible en juin de l'année prochaine, suivie de 3 à 4 mois d'assurance qualité.
Le plan de projet de la communauté PHP est le suivant :
Parce que le projet est toujours en cours de développement, les descriptions des fonctionnalités que l'on peut voir sont relativement vagues. 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.
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. À en juger par les données, les performances d'exécution de PHPng ont presque doublé 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. Quand tout sera terminé, je pense que nous pourrons voir un PHP7 avec des performances plus élevées.
Ces données de speed test proviennent de la communauté PHP (wiki.php.net/phpng), et interceptent une partie des données :
Pour l'actuel PHP5. Version 6, l'amélioration des performances de PHPNG en octobre a été très évidente :
Une traduction simple :
2. La controverse sur le type faible de PHP
PHP a de nombreuses fonctionnalités controversées, mais à mesure que la version linguistique est publiée et améliorée, 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, aux yeux de beaucoup d’entre nous, 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 rend-il pas le langage plus simple ?
En fait, certaines personnes pensent qu'il s'agit d'un problème sérieux, et la critique de la "faible frappe" ressemble à ceci :
Ils estiment que celles-ci ne correspondent pas à la simplicité du « ce que vous voyez est ce que vous obtenez », et que les langues à grammaire stricte sont plus efficaces et plus faciles à « comprendre ».
Des langages tels que Javascript ont également été critiqués de la même manière car ils fonctionnent de la même manière sur cette question. Cependant, si une langue est finalement utilisée à grande échelle, elle doit avoir ses raisons. 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 les développeurs 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, nous sommes partis du code machine des 0 et des 1, 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 procure 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 améliorations des performances de HHVM pour PHP sont impressionnantes, et le PHP7 qui travaille dur est impressionnant. il. Les deux sont d’excellents projets open source et tous deux avancent et se développent constamment. 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. Cependant, personnellement, je suis plus optimiste à propos de 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.
Tutoriel recommandé : "Tutoriel vidéo php"
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!