253 votes

Qu'est-ce qui est le plus efficace pour libérer de la mémoire avec PHP : unset() ou $var = null ?

Je réalise que la seconde évite la surcharge d'un appel de fonction ( mise à jour est en fait une construction linguistique), mais il serait intéressant de savoir si l'une est meilleure que l'autre. J'ai utilisé unset() pour la plupart de mon codage, mais j'ai récemment regardé quelques cours respectables trouvés sur le net qui utilisent $var = null à la place.

Y a-t-il une préférence, et quel est le raisonnement ?

3voto

Exemple de code d'un commentaire

echo "PHP Version: " . phpversion() . PHP_EOL . PHP_EOL;

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $a = 'a';
    $a = NULL;
}
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds" . PHP_EOL;

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $a = 'a';
    unset($a);
}
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds" . PHP_EOL;

La course à pied conteneur docker à partir de l'image php:7.4-fpm et autres..

PHP Version: 7.4.8
took 0.22569918632507 seconds null
took 0.11705803871155 seconds unset
took 0.20791196823121 seconds null
took 0.11697316169739 seconds unset

PHP Version: 7.3.20
took 0.22086310386658 seconds null
took 0.11882591247559 seconds unset
took 0.21383500099182 seconds null
took 0.11916995048523 seconds unset

PHP Version: 7.2.32
took 0.24728178977966 seconds null
took 0.12719893455505 seconds unset
took 0.23839902877808 seconds null
took 0.12744522094727 seconds unset

PHP Version: 7.1.33
took 0.51380109786987 seconds null
took 0.50135898590088 seconds unset
took 0.50358104705811 seconds null
took 0.50115609169006 seconds unset

PHP Version: 7.0.33
took 0.50918698310852 seconds null
took 0.50490307807922 seconds unset
took 0.50227618217468 seconds null
took 0.50514912605286 seconds unset

PHP Version: 5.6.40
took 1.0063569545746 seconds null
took 1.6303179264069 seconds unset
took 1.0689589977264 seconds null
took 1.6382601261139 seconds unset

PHP Version: 5.4.45
took 1.0791940689087 seconds null
took 1.6308979988098 seconds unset
took 1.0029168128967 seconds null
took 1.6320278644562 seconds unset

Mais, avec un autre exemple :

<?php
ini_set("memory_limit", "512M");

echo "PHP Version: " . phpversion() . PHP_EOL . PHP_EOL;

$start = microtime(true);
$arr = [];
for ($i = 0; $i < 1000000; $i++) {
    $arr[] = 'a';
}
$arr = null;
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds" . PHP_EOL;

$start = microtime(true);
$arr = [];
for ($i = 0; $i < 1000000; $i++) {
    $arr[] = 'a';
}
unset($arr);
$elapsed = microtime(true) - $start;

echo "took $elapsed seconds" . PHP_EOL;

Résultats :

PHP Version: 7.4.8
took 0.053696155548096 seconds
took 0.053897857666016 seconds

PHP Version: 7.3.20
took 0.054572820663452 seconds
took 0.054342031478882 seconds

PHP Version: 7.2.32
took 0.05678391456604 seconds
took 0.057311058044434 seconds

PHP Version: 7.1.33
took 0.097366094589233 seconds
took 0.073100090026855 seconds

PHP Version: 7.0.33
took 0.076443910598755 seconds
took 0.077098846435547 seconds

PHP Version: 7.0.33
took 0.075634002685547 seconds
took 0.075317859649658 seconds

PHP Version: 5.6.40
took 0.29681086540222 seconds
took 0.28199100494385 seconds

PHP Version: 5.4.45
took 0.30513095855713 seconds
took 0.29265689849854 seconds

2voto

Michael B. Points 512

J'ai créé un nouveau test de performance pour unset y =null parce que, comme mentionné dans les commentaires, le texte ici écrit comporte une erreur (la recréation des éléments). J'ai utilisé des tableaux, comme vous le voyez, cela n'a pas d'importance maintenant.

<?php
$arr1 = array();
$arr2 = array();
for ($i = 0; $i < 10000000; $i++) {
    $arr1[$i] = 'a';
    $arr2[$i] = 'a';
}

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    $arr1[$i] = null;
}
$elapsed = microtime(true) - $start;

echo 'took '. $elapsed .'seconds<br>';

$start = microtime(true);
for ($i = 0; $i < 10000000; $i++) {
    unset($arr2[$i]);
}
$elapsed = microtime(true) - $start;

echo 'took '. $elapsed .'seconds<br>';

Mais je ne peux le tester que sur un serveur PHP 5.5.9, voici les résultats : - a pris 4.4571571350098 secondes - 4.4425978660583 secondes

Je préfère unset pour des raisons de lisibilité.

1voto

zero8 Points 713

unset le code, s'il ne libère pas la mémoire immédiate, est toujours très utile et ce serait une bonne pratique de le faire chaque fois que nous passons sur les étapes du code avant de sortir d'une méthode. prenez note que ce n'est pas une question de libérer la mémoire immédiate. La mémoire immédiate est pour le CPU, qu'en est-il de la mémoire secondaire qui est la RAM.

et cela permet également d'éviter les fuites de mémoire.

veuillez voir ce lien http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2

J'utilise unset depuis longtemps maintenant.

une meilleure pratique comme celle-ci dans le code pour annuler instantanément toutes les variables qui ont déjà été utilisées comme tableau.

$data['tesst']='';
$data['test2']='asdadsa';
....
nth.

y just unset($data); pour libérer toute utilisation des variables.

Veuillez consulter le sujet connexe pour annuler l'enregistrement

Quelle est l'importance de l'annulation des variables en PHP ?

[bug]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X