Après avoir utilisé PHP pendant un certain temps maintenant, j'ai remarqué que toutes les fonctions PHP intégrées ne sont pas aussi rapides que prévu. Considérez ces deux implémentations possibles d'une fonction qui trouve si un nombre est premier en utilisant un tableau de nombres premiers mis en cache.
//very slow for large $prime_array
$prime_array = array( 2, 3, 5, 7, 11, 13, .... 104729, ... );
$result_array = array();
foreach( $prime_array => $number ) {
$result_array[$number] = in_array( $number, $large_prime_array );
}
//speed is much less dependent on size of $prime_array, and runs much faster.
$prime_array => array( 2 => NULL, 3 => NULL, 5 => NULL, 7 => NULL,
11 => NULL, 13 => NULL, .... 104729 => NULL, ... );
foreach( $prime_array => $number ) {
$result_array[$number] = array_key_exists( $number, $large_prime_array );
}
En effet, il in_array
est implémenté avec une recherche linéaire O (n) qui ralentira linéairement à mesure qu'il $prime_array
grandit. Où la array_key_exists
fonction est implémentée avec une recherche de hachage O (1) qui ne ralentira pas à moins que la table de hachage ne soit extrêmement remplie (auquel cas ce n'est que O (n)).
Jusqu'à présent, j'ai dû découvrir les big-O via des essais et des erreurs, et parfois regarder le code source . Maintenant pour la question ...
Existe-t-il une liste des grands temps O théoriques (ou pratiques) pour toutes * les fonctions PHP intégrées?
* ou du moins les plus intéressants
Par exemple, je trouve qu'il est très difficile de prédire le grand O des fonctions énumérées parce que la mise en œuvre possible dépend des structures de données de base inconnue de PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(avec des entrées de tableau), etc.
true
, puis de tester la présence en utilisant isset($large_prime_array[$number])
. Si je me souviens bien, c'est dans l'ordre d'être des centaines de fois plus rapide que la in_array
fonction.
array_key_exists
, je compare à in_array
. in_array
itère chaque élément du tableau et compare la valeur à l'aiguille que vous lui passez. Si vous retournez les valeurs à la clé (et remplacez simplement chacune des valeurs par une valeur fictive comme true
, l'utilisation isset
est beaucoup plus rapide. En effet, les clés d'un tableau sont indexées par PHP (comme une table de hachage). Par conséquent, la recherche une matrice de cette manière peut avoir une amélioration significative de la vitesse.