valor multidimensional index buscar array php arrays parsing hash switch-statement

index - php array search multidimensional



En PHP, lo que es más rápido, gran instrucción Switch o Array key lookup (2)

En PHP, ¿qué es más rápido, crear una declaración de conmutación grande o configurar una matriz y buscar la clave?

Ahora, antes de responder, soy consciente de que para las búsquedas puras, la matriz es más rápida. Pero, esto supone asumir la creación de la matriz una sola vez y luego buscarla repetidamente.

Pero eso no es lo que estoy haciendo, cada ejecución del código es nueva, la matriz se usará solo una vez cada vez. Por lo tanto, todos los hash de la matriz deben calcularse de manera fresca cada vez, y me pregunto si hacer esa configuración es más lento que simplemente tener una instrucción de conmutación.


En cierto modo, depende del tamaño de la matriz, pero para la mayoría de los propósitos prácticos, puede considerar que la matriz es más rápida. La razón es simple; una instrucción de conmutación debe comparar secuencialmente con cada entrada en la instrucción de conmutación, pero el enfoque de matriz simplemente toma el algoritmo hash y encuentra esa entrada. Cuando tiene tan pocas entradas en su conmutador que las comparaciones secuenciales son más rápidas que el hash, es más rápido usar un conmutador, pero el enfoque de matriz se vuelve más eficiente rápidamente. En términos de informática, se trata de O (n) vs. O (1).


Hice algunas pruebas:

array_gen.php:

<? echo ''<? $a = 432; $hash = array( ''; for($i = 0; $i < 10000; $i++) echo "$i => $i,/n"; echo ''); echo $hash[$a]; '';

switch_gen.php:

<? echo ''<? $a = 432; switch($a) { ''; for($i = 0; $i < 10000; $i++) echo "case $i: echo $i; break;/n"; echo ''}'';

Entonces:

php array_gen.php > array_.php php switch_gen.php > switch.php time tcsh -c ''repeat 1000 php array.php > /dev/null'' 19.297u 4.791s 0:25.16 95.7% time tcsh -c ''repeat 1000 php switch.php > /dev/null'' 25.081u 5.543s 0:31.66 96.7%

Luego modifiqué el bucle para:

for($i = ''a''; $i < ''z''; $i++) for($j = ''a''; $j < ''z''; $j++) for($k = ''a''; $k < ''z''; $k++)

Para crear 17576, combinaciones de 3 letras.

time tcsh -c ''repeat 1000 php array.php > /dev/null'' 30.916u 5.831s 0:37.85 97.0% time tcsh -c ''repeat 1000 php switch.php > /dev/null'' 36.257u 6.624s 0:43.96 97.5%

El método de matriz gana todo el tiempo, incluso una vez que incluye el tiempo de configuración. Pero no por mucho. Así que creo que ignoraré esta optimización e iré con lo que sea más fácil.