Después de usar PHP por un tiempo, noté que no todas las funciones integradas de PHP son tan rápidas como se esperaba. Considere estas dos posibles implementaciones de una función que encuentra si un número es primo usando una matriz de primos en caché.
//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 );
}
Esto se debe a que in_array
se implementa con una búsqueda lineal O (n) que disminuirá linealmente a medida que $prime_array
crece. Donde la array_key_exists
función se implementa con una búsqueda hash O (1) que no se ralentizará a menos que la tabla hash se llene extremadamente (en cuyo caso es solo O (n)).
Hasta ahora he tenido que descubrir las grandes O a través de prueba y error, y ocasionalmente mirando el código fuente . Ahora para la pregunta ...
¿Existe una lista de los grandes tiempos teóricos (o prácticos) de O para todas * las funciones PHP integradas?
* o al menos los interesantes
Por ejemplo, se me hace muy difícil predecir el gran O de las funciones enumeradas debido a la posible aplicación depende de las estructuras de datos básicos desconocida de PHP: array_merge
, array_merge_recursive
, array_reverse
, array_intersect
, array_combine
, str_replace
(con las entradas de la matriz), etc.
true
y luego probar la presencia usando isset($large_prime_array[$number])
. Si no recuerdo mal, está en el orden de ser cientos de veces más rápido que la in_array
función.
array_key_exists
, me estoy comparando in_array
. in_array
itera cada elemento de la matriz y compara el valor con la aguja que le pasa. Si cambia los valores a la clave (y simplemente reemplaza cada uno de los valores con un valor ficticio como true
, usar isset
es muchas veces más rápido. Esto se debe a que las claves de una matriz están indexadas por PHP (como una tabla hash). En consecuencia, la búsqueda una matriz de esta manera puede tener una mejora significativa en la velocidad.