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 1Czy 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).