Je suis confronté à plus de consommation de mémoire en Php 7 comparer à PHP 5.6
Quand je faisais un test, j'ai trouvé que PHP 7 a l'aide de plus de mémoire que de PHP 5.6.
Donc, j'ai fait un test. J'ai couru un script contenant seulement:
$a=10;
et ci-dessous les résultats pour la mémoire utilisée lorsque j'ai utilisé PHP CLI sans modules (php -n
)
php 5.6 = 222600 Bytes
php 7.0 = 350448 Bytes
* PHP 5.6.23 (cli) (built: Jun 22 2016 12:13:15)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
* PHP 7.0.9 (cli) (built: Jul 20 2016 10:47:41) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
Environnement est
- Système d'exploitation: window 10
- Serveur : IIS (bien que j'ai utilisé de la CLI, pas sur le serveur), avec fast cgi
- machine : 64 bits
- php-5.6.23-nts-Win32-VC11-x64
- php-7.0.9-nts-Win32-VC14-x64
Quelqu'un peut-il expliquer pourquoi j'ai obtenu ce résultat?
Des Tests Supplémentaires
L'aide de ce code, comme suggéré par @gordon,
$i=0;
while ($i++ < 100000) ;
php 5.6: 227408 octets
php 7.0: 386640 octets
J'ai déterminé l'utilisation de la mémoire avec ce code:
echo PHP_EOL;
echo "Memory Usage :".memory_get_usage();
echo PHP_EOL;
echo "Real Memory Usage :".memory_get_usage(true);
echo PHP_EOL;
echo "Real Peak Memory Usage :".memory_get_peak_usage(true);
echo PHP_EOL;
echo "Peak Memory Usage :".memory_get_peak_usage();
- Avez-vous comparé avec un peu de code? Même si, plus ou moins, vide script consomme plus de 100k ne nous dit pas si c'est vrai, dans un "vrai" scénario. Ce qui est plus intéressant de savoir..
- Le plus probable, parce que PHP/7 optimisations ont été la cible des scripts complexes. L'un des revêtements sont très peu susceptibles de provoquer un goulot d'étranglement.
- Peut-être les deux versions permis à plus ou moins modules, mais je ne suis pas sûr
- en fait, il est differnce quand je suis de benchmarking dans l'application, donc j'ai pensé à trouver la cause du problème, donc démarré avec une seule ligne de code.
- je suis en cours d'exécution de code à l'aide de la cli, sans charger n'importe quel module.
- peut-être, mais l'exemple que vous donnez ici est artificiel et très inutile. Si vous voulez savoir pourquoi votre application consomme plus de mémoire, faire qui dans une question avec plus de détails à propos de l'application. Le profil de votre application. La façon dont la question est formulée maintenant insinue que PHP7 en général mange plus de mémoire. C'est un nuisible suggestion à faire, parce que les gens vont lire cela et le prendre pour une pièce de monnaie (après tout, c'était écrit sur Stack Overflow), alors qu'en réalité, PHP7 n'a de nombreuses améliorations pour réduire l'utilisation de la mémoire. Voir par exemple nikic.github.io/2014/12/22/...
- J'ai vraiment apprécier et impatient pour PHP7, même le temps d'exécution a diminué dans PHP7, qui est plus bénéfique pour moi. Je ne suis pas de pointage de PHP 7, je veux juste savoir, quelle est la raison derrière l'allocation de mémoire, j'ai beaucoup cherché, mais ne pouvait pas trouver c'est pourquoi j'ai posé la question. j'ai mis l'exemple b/c tout on peut tester que sur leur machine sans aucune logique.
- Il est probable que l'amorçage de l'interprète/moteur nécessitant plus de mémoire maintenant. Ce n'est certainement pas le $a=10; l'assignation que vous faites. Comparer les 3v4l.org/jmBha/perf#output pour un autre exemple artificiel.
- Je suis en cours d'exécution de code sur la cli, sans charger n'importe quel module, en revanche, oui, j'ai la configuration par défaut de 128 M, pour
- Je upvoted la question parce que je pensais que le scénario (les frais généraux d'un presque vide script) était assez intéressant en termes de culture générale (je sais que ce n'est pas un monde réel scénario, nous devrions faire attention à) et pourrait utiliser quelques réponses à apporter des modifications à PHP internals. Je pense que la mise à jour pour fournir un tout autre script modifie le sens de la question et le rend effectivement plus vague et moins responsable.
- Merci , j'ai la mise à jour b/c Gordon mentionner que le service de base n'était pas un monde réel scénario, alors que mon souci était le cas ,pourquoi la consommation de mémoire en php 7 est élevé, même une seule variable est initialisée, j'ai donc exécuté 3v4l.org/jmBha/perf#output le code à ma machine à confirmer plus, j'ai donc ajouté un autre morceau de production en tant que mise à jour 2. Je voulais juste vous assurer que ce n'est pas seulement l'initialisation d'une variable. Ma préoccupation est à peu près comment ça se passe?
- Si vous êtes inquiet au sujet d'un processus vide à l'aide d'une centaine de kilo-octets supplémentaires votre meilleur pari est probablement la mise à niveau de votre serveur à partir des années 1990 de l'ère de l'ordinateur.
- Alors, laquelle de ces méthodes avez-vous utilisé? Le bon est
memory_get_usage()
(pas de "vrai" param, pas de "pic"). Sinon, vous êtes soit en mesurant les détails de l'allocation ou de la mesure de l'utilisation de la mémoire par le compilateur. - Je comprends, je comprends la valeur de tous les quatre, et tous les résultats sont plus élevés dans les PHP7 comparer à php 5.6, ma préoccupation est que, s'il en est ainsi pour l'initialisation d'une variable ou d'une boucle de processus de ce qui se passerait pour une page complexe.et effectivement il se passe dans l'une de mes page php.
- Vous avez peut être droit, juste par curiosité, quelle est la gradation de serveur peut aider dans ce cas. Je comprends que je peux augmenter la mémoire, mais d'un autre côté, je vais aussi essayer d'améliorer le code pour qu'il consomme moins de ressources.
- Je ne suis pas sûr de savoir comment vous proposons d'améliorer le code, étant donné que vous êtes voir les différences avec
$a=10;
. Vous vous engagez dans l'optimisation prématurée. - Ainsi, les souches des différentes versions est fondamentalement différent, il n'est pas surprenant qu'une version plus avancée de PHP est également plus grand en taille. De plus, le Zend Engine version est différente, et même le VC version, ils sont compilés sur est différent aussi. Rien d'étonnant jusqu'ici, la question est, faut-il augmenter de façon exponentielle en fonction de la taille de votre script, ou la différence reste similaire? Avec ces petits codes, il est difficile de le déterminer.
- Je maintiens qu'il est intéressant de noter que vous pouvez limiter la mémoire autorisée à 128 MO et PHP ignore le paramètre. Pourquoi est-ce qui se passe? Vous avez défini explicitement les limites de la mémoire dans vos fichiers ini? Si vous n'obtenez pas de PHP pour se conformer aux limites de la mémoire alors comment obtenir une interprétation valable de votre utilisation de la mémoire les résultats? c'est à dire que le reste est réglé pour permettre à PHP d'utiliser toute la mémoire qu'il souhaite? À quel point vous êtes simplement en regardant ce que PHP ne quand pas de restrictions sont prévues?
- Non, il n'est pas augmenté de façon exponentielle , mais ouais, j'avais un script en 5.6, c'était de prendre ~628K, mais en PHP 7 il a fallu ~1069k. C'est ce qui m'inquiétait, et j'ai essayé de trouver la raison, je ne dis pas que cela ne devrait pas arriver en php 7.0, mais, en raison de la curiosité, je veux juste savoir ce qui a changé en php5.6 et php7.0, que l'origine de ce problème. Il serait très utile, si je pouvais trouver la raison, comme c'est en raison de la compilation dans vc 14, ou zend engine, ou PHP7.0 noyau lui-même.
- Comment savez-vous que PHP 7 n'est pas seulement d'être plus efficace et plus juste en utilisant plus de mémoire que c'est plus rapide et disponible? c'est à dire qu'il essaie de vous aider. Il est vraiment clair que vous avez défini des restrictions de mémoire. Afin de vous plaindre du comportement par défaut des versions différentes de PHP?
- Ne vous méprenez pas, mon Pote, je ne me plains pas, je suis juste essayer de comprendre les choses. Même dans les commentaires précédents j'ai mentionné qu'il est plus efficace dans l'exécution, l'enregistrement des temps de réponse signifie qu'il peut serveur de plus de requêtes par seconde, ce qui est bon pour tout le monde, Mais, je veux juste savoir la raison de plus de l'utilisation de la mémoire. Même moi, je ne suis pas confirmé que c'est dû à PHP7 de soi. il peut être binaire windows de PHP 7 est en train de faire une telle chose, je ne suis pas en soulignant l'opposition, mais je veux juste savoir la raison, afin que je puisse suivre les meilleurs.
- Pourquoi pensez-vous que PHP est ignorant la limite de la mémoire? Aucun des chiffres cités sont n'importe où près de 128M. Ce paramètre ne veut pas dire "s'il vous plaît utiliser exactement 128M", il signifie "si vous trouvez que vous avez besoin de plus de 128M, interrompre immédiatement le processus". Si le plafond (la limite de la mémoire) est de 10 pieds de haut, 100 pieds de haut, ou emporté par un ouragan ne fait aucune différence pour la mesure de la hauteur quelqu'un (l'utilisation de la mémoire de quelque chose de beaucoup plus petite que celle de la limite).
- Mes excuses, je n'ai pas lu vos valeurs correctement. Vous avez raison, les valeurs sont inférieures à 1 MO. Je soupçonne tout ce que vous voyez est le "ménage par défaut" que PHP a lors du démarrage. Je soupçonne que l'utilisation de la mémoire ferait plutôt plus de sens quand vous commencez à allouer des tableaux de grande taille ou des lots d'objets. c'est à dire les entrées de centaines de milliers de personnes. Vous devriez alors voir que PHP 7 est plus "efficace". j'.e .moins de mémoire pour les mêmes structures de données.
- Un excellent outil pour voir les différences entre les versions de PHP est 3v4l.org Aussi agréable à comparer des perles comme la 3v4l.org/cgOC3
Vous devez vous connecter pour publier un commentaire.
Comprendre la réponse à votre question - vous avez besoin de comprendre comment PHP5 et PHP7 allocations de mémoire.
PHP5
de l'allocation de mémoire "à la Demande", en supposant que, de par Zend Engine structure.Dans
PHP7
, c'est quelques optimisations apportées à ce côté, donc, sur l'allocation de la mémoire "par morceaux"Ces différences rend très bien l'augmentation de la performance (parce que le moteur n'avez pas besoin d'allouer de la mémoire à l'exécution chaque fois que vous en avez besoin et de gagner du temps sur la fragmentation), mais il augmente la consommation de mémoire pour les "très petits" des programmes, dont la taille est en dessous de la "taille de bloc".
Et oui, PHP7 économise de la mémoire sur beaucoup de grands programmes.
Vous pouvez consulter toutes ces différences dans les images ci-dessous:
Graphique construit avec la référence:
1.php
bench.sh
octave tiroir
Lire plus
https://drive.google.com/file/d/0B3UKOMH_4lgBUTdjUGxIZ3l1Ukk/view
https://wiki.php.net/phpng-int
https://wiki.php.net/phpng-upgrading
http://nikic.github.io/2015/05/05/Internal-value-representation-in-PHP-7-part-1.html
et
http://nikic.github.io/2015/06/19/Internal-value-representation-in-PHP-7-part-2
Vos tests montrent plus l'utilisation de la mémoire en PHP 7.0, parce que le code de test est très simple.
PHP 7.0 est connu pour utiliser moins de mémoire (et plus rapide) que PHP 5.6 due à un changement radical de réécriture de l'intérieur ZEND Engine (l'interprète de base)
Comme Gordon commenté plus probable que les nouvelles fonctionnalités et améliorations en PHP 7.0 besoin d'un "bootstrap" qui entraînent des résultats négatifs des essais sur de petits morceaux de code.
Nous allons essayer avec quelque chose de plus complexe: construire un tableau de 10.000 entiers puis les trier à l'aide de Quicksort de l'algorithme.
Voici le résultat que j'obtiens:
Et encore un simple 20 lignes de quicksort est bien à partir des applications du monde réel avec des milliers de lignes de codes, de nombreuses classes de déclarations, de nombreux cas...
J'ai exécuter le test sur http://phptester.net
Ci-dessous est le code
De crédit pour l'algorithme quicksort en PHP: http://andrewbaxter.net/quicksort.php
D'avance je tiens à dire que si vous voyez plus l'utilisation de la mémoire en PHP 7 sur de code réel, la cause la plus probable est que PHP 7 rapport de l'utilisation de la mémoire de mysqlnd tampon de requêtes dans le cadre de l'utilisation de la mémoire. En PHP 5, cette utilisation de la mémoire n'a pas été signalé (mais bien sûr, la mémoire était encore utilisé). Pour les grandes requêtes cela peut faire une très grande différence.
Maintenant à votre cas réel, qui est essentiellement l'utilisation de la mémoire de PHP immédiatement après la demande de démarrage. Le réponse par MobDev déjà explique pourquoi il y a une divergence dans la "vraie" utilisation de la mémoire, qui est l'utilisation de la mémoire métrique qui indique la quantité de mémoire PHP allocateur a demandé au système d'allocation de noyau. Comme MobDev souligne PHP 7 va allouer de la mémoire en beaucoup plus gros morceaux (2 MO) et est également plus agressif sur la mise en cache alloué morceaux.
Cependant, cela n'explique pas la différence de "non-vrai" utilisation de la mémoire, qui ne prennent pas ces allocateur de détails en compte. Il est facile de vérifier si la mémoire est à l'aide d'un profileur de mémoire, par exemple en exécutant le script PHP à travers
USE_ZEND_ALLOC=0 valgrind --tool=massif
. LeUSE_ZEND_ALLOC=0
partie indique à PHP de ne pas utiliser son propre allocateur.Tout d'abord cela va vous montrer que l'utilisation réelle de la mémoire et de l'utilisation de la mémoire rapporté par PHP diffèrent assez sensiblement. Massif montrera 3.2 MO utilisation de PHP 5.6 et 2.3 MO pour PHP 7. La raison en est que PHP seuls les rapports de la mémoire qui passe par son propre allocateur (ZMM), tandis que de nombreuses structures qui survivent à travers de multiples requêtes ne sont pas alloués à l'aide.
Le plus grand allocations à travers le système de l'allocateur (donc pas été signalés dans l'utilisation de la mémoire) sont:
Les "classes internes/funcs" le nombre est un brut de limite inférieure, car il ya beaucoup de petites allocations en cause ici qui sont difficiles à compter. Une principale différence est visible, qui est que PHP 7 ne pas utiliser un fixe interné tampon de chaîne (la liste est la taille de la table de hachage de la mémoire tampon, j'en vois qui n'incluent pas de la taille des cordes elles-mêmes).
Cependant, ce n'est toujours pas répondre à la question de la signalé l'utilisation de la mémoire. Dans ce cas, le plus grand des allocations sont:
Il y a quelques différences ici. Le principal est que PHP 7 utilise une plus grande VM taille de la page (environ deux fois plus grande). De plus, PHP 7 utilise une arène de stocker certaines structures (comme les fonctions de l'utilisateur), qui commence avec une taille par défaut de 64 ko. D'autre part la taille de l'objet tampon de stockage est significativement plus faible dans PHP 7.
Donc, essentiellement, le TL;DR réponse est que PHP 7 utilise une plus grande VM pile de la taille de page.
Php 5.6 nécessite moins d'octets que par rapport à la version 7.0.