15 votes

SplFixedArray est-il vraiment plus performant que les tableaux ?

Je teste le SplFixedArray qui construit un tableau avec les jours de la semaine, et j'obtiens les résultats suivants :

<?php

$days = new SplFixedArray(7);

$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";

echo memory_get_peak_usage() . "\n"; //Returns 327688
echo memory_get_usage() . "\n"; //Returns 327140
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288 

Avec les matrices traditionnelles :

<?php

$days = array();

$days[0] = "Monday";
$days[1] = "Tuesday";
$days[2] = "Wednesday";
$days[3] = "Thursday";
$days[4] = "Friday";
$days[5] = "Saturday";
$days[6] = "Sunday";

echo memory_get_peak_usage() . "\n"; //Returns 327528
echo memory_get_usage() . "\n"; //Returns 326820
echo memory_get_peak_usage(true) . "\n"; //Returns 524288
echo memory_get_usage(true) . "\n"; //Returns 524288

Cela a-t-il un sens pour vous ?

20voto

Mahn Points 5565

Comme l'illustrent les tests de référence réalisés par l'auteur de l'article cet article :

http://www.johnciacia.com/wp-content/uploads/2011/01/3.png

On peut en conclure que l'empreinte mémoire de SplFixedArray est effectivement plus petite, mais perceptible uniquement pour une grande quantité d'éléments de tableau . Parce que SplFixedArray est techniquement une instance d'une classe De plus, contrairement aux tableaux traditionnels, c'est ce qui fait que les petits tableaux consomment un peu plus de mémoire s'ils sont implémentés par SplFixedArray, mais comme ces quelques centaines d'octets supplémentaires restent constants, ils deviennent sans importance lorsque la taille du tableau augmente.

Remarque : ne pas micro-optimiser, chaque marteau n'est pas créé pour chaque clou. SplFixedArray est là pour les cas extrêmes, par exemple pour les tableaux de centaines de milliers d'éléments, où la réduction de quelques octets d'utilisation de la mémoire par élément a un impact important sur l'utilisation globale de la mémoire ; mais ne l'utilisez pas à moins d'être vraiment sûr que votre tableau est ou pourrait être un goulot d'étranglement potentiel de l'application.

9voto

periklis Points 4978

Un SplFixedArray est censé être plus rapide que les tableaux. Il ne dit rien sur la consommation de mémoire (qui est ce que vous testez ici). Extrait de http://php.net/manual/en/class.splfixedarray.php :

"Les principales différences entre un SplFixedArray et un tableau PHP normal est que le SplFixedArray est de longueur fixe et n'autorise que les entiers dans l'intervalle comme index. L'avantage est que cela permet une tableau".

Cependant, l'utilisation d'un tableau de 100 000 entrées révèle qu'il utilise également moins de RAM :

$users = array();
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(), 'name' => 'default');
}
echo memory_get_peak_usage(true); //returns 31457280

$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) { 
    $users[$i] = array('id' => rand(),
            'name' => 'default');
}
echo memory_get_peak_usage(true); //return 26738688

2voto

Raffaello Points 1460

Oui si vous les utilisez avec une taille fixe.

Si vous changez constamment la taille pour chaque nouvel élément à ajouter, cela peut être plus lent et il se peut que ce ne soit pas le bon usage aussi.

C'est plus rapide en raison de l'implémentation des tableaux en PHP qui ne sont pas de vrais tableaux comme par définition dans les langages de programmation, mais plutôt des tableaux associatifs, implémentés avec une table de hachage. (les tableaux en PHP sont donc des tables de hachage).

Alors que le SplFixedArray est implémenté en utilisant le "malloc" du C comme un tableau C presque normal, bien sûr enveloppé dans une petite structure pour garder la trace et manipuler le tableau selon les cas d'utilisation.

UPDATE

En même temps, depuis PHP 7.x, il n'y a pas trop de différence de temps dans les performances. La seule façon de le savoir vraiment est de faire un benchmark basé sur vos propres cas d'utilisation. S'il n'y a pas d'exigence particulière, la version normale de PHP array est suffisant.

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