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_arrayest implémenté avec une recherche linéaire O (n) qui ralentira linéairement à mesure qu'il $prime_arraygrandit. Où la array_key_existsfonction 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_arrayfonction.
array_key_exists, je compare à in_array. in_arrayitè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 issetest 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.
