/ / W PHP, co jest szybsze, duża instrukcja Switch lub wyszukiwanie klucza Array - php, tablice, parsowanie, hash, instrukcja switch

W PHP, co jest szybsze, duża instrukcja Switch lub wyszukiwanie klucza Array - php, tablice, parsowanie, hash, switch-statement

W PHP co jest szybsze, tworzenie dużej instrukcji switch lub konfigurowanie tablicy i szukanie klucza?

Teraz, zanim odpowiesz, doskonale zdaję sobie sprawę, że dla czystych wyszukiwań tablica jest szybsza. Zakłada się jednak, że utworzysz tablicę tylko raz, a następnie będziesz ją wielokrotnie przeglądać.

Ale to nie jest to, co robię - każdy z nich przechodzikod jest nowy, tablica będzie używana tylko raz za każdym razem. Więc wszystkie skróty tablicowe muszą być obliczane za każdym razem od nowa, i zastanawiam się, czy konfiguracja jest wolniejsza niż zwykła instrukcja switch.

Odpowiedzi:

13 dla odpowiedzi nr 1

Czy niektóre testy:

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 "}";

Następnie:

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%

Następnie zmodyfikowałem pętlę do:

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

Aby utworzyć 17576, trzyliterowe kombinacje.

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%

Metoda tablicowa wygrywa za każdym razem, nawet po uwzględnieniu czasu instalacji. Ale nie za dużo. Myślę więc, że zignoruję tę optymalizację i pójdę z tym, co jest łatwiejsze.


4 dla odpowiedzi nr 2

To zależy od wielkości tablicy, ale dlaW najbardziej praktycznych celach można uznać, że tablica jest szybsza. Powód jest prosty; instrukcja switch musi się porównywać sekwencyjnie z każdym wpisem w instrukcji switch, ale podejście tablicowe po prostu bierze skrót i znajduje ten wpis. Kiedy masz tak mało wpisów w przełączniku, że sekwencyjne porównania są szybsze niż haszowanie, szybsze jest użycie przełącznika, ale podejście tablicowe staje się wydajniejsze szybko. Z punktu widzenia informatyki jest to kwestia O (n ) vs. O (1).