[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: switch или if?
Ka4_0k
Вот выпала надобность организовать около 10 различных условий. И вот задумался о скорости выполнения. Что будет быстрее выполняться if() elseif().... Либо же будет быстрее со switch?
Думаю это не одному мне будет интересно smile.gif



Спустя 16 минут, 32 секунды (15.11.2009 - 21:51) sergeiss написал(а):
Тебе честно дать ответ на твой вопрос? smile.gif

Ответ простой: одно из них будет быстрее, но ты этого не заметишь smile.gif Потому что и то, и другое будет выполняться "одно мгновение". Поэтому не парь свой мозг wink.gif

Спустя 7 минут, 29 секунд (15.11.2009 - 21:58) Ka4_0k написал(а):
А если их несколько?smile.gif Разница то с количеством будет увеличиваться... Вот и интересно стало что быстрее, дабы скрипт выполнялся быстрее)

Спустя 5 минут, 50 секунд (15.11.2009 - 22:04) sergeiss написал(а):
Если тебе очень-очень хочется это проверить, то сделай тестовый скрипт, да так, чтобы он сам замерял время операций. Сделай в цикле 100 тыс. или 1 млн. операций, и сравни полученное время.

Спустя 7 минут, 42 секунды (15.11.2009 - 22:12) Ka4_0k написал(а):
Если кому интересно с отрывом в 0.1 сек лидировал if ...elseif... smile.gif

Спустя 6 минут, 51 секунда (15.11.2009 - 22:19) sergeiss написал(а):
Ka4_0k при каком количестве циклов-то? И код покажи. Вот это уже будет интереснее, чем абстрактный вопрос на эту тему smile.gif

Спустя 12 минут, 35 секунд (15.11.2009 - 22:31) Ka4_0k написал(а):
Намба уан
$time = microtime();
$a = 123;
for($i=0;$i<100000;$i++) {
if($a == 12) {$b=2;}
elseif($a == 1) {$b=1;}
elseif($a == 123) {$b=3;}
}

die(var_dump(microtime()-$time));

Намба ту

$time = microtime();
$a = 123;
for($i=0;$i<100000;$i++) {
switch($a) {
case '12':
$b=1;
break;
case '1':
$b=2;
break;
case '123':
$b=3;
break;
}
}

die(var_dump(microtime()-$time));

Спустя 12 минут, 13 секунд (15.11.2009 - 22:44) MainVoid написал(а):
Switch имхо более удобочитабелен при больших вложениях.

Спустя 20 минут, 22 секунды (15.11.2009 - 23:04) Mikolasan написал(а):
Цитата
Switch имхо более удобочитабелен при больших вложениях.

Посностью согласен!!! Во всяком случае его наглядно легче воспринимать. А-то 100% через 2 недели сам запутаешься в своих же if-ах.

Спустя 7 часов, 5 минут, 53 секунды (16.11.2009 - 06:10) twin написал(а):
Ka4_0k
Тест твой некорректен.
Во первых, ты тут ничего не забыл?
$time = microtime();

А во вторых, ты меряешь не выполнение операций переключения, а выполнения довольно длинного кода. И меряешь крайне не аккуратно. Потому что в switch ты сравниваешь значения с преобразованием типов данных, а в ифках - в лоб. Попробуй так замерить:
$time = microtime(true);
$a = '123';
for($i=0;$i<100000;$i++) {
if($a == '12') {$b=2;}
elseif($a == '1') {$b=1;}
elseif($a == '123') {$b=3;}
}

print (microtime(true) - $time);


$time = microtime(true);
$a = '123';
for($i=0;$i < 100000;$i++) {
switch($a) {
case '12':
$b=1;
break;
case '1':
$b=2;
break;
case '123':
$b=3;
break;
}
}

print (microtime(true) - $time);

Спустя 7 часов, 27 минут, 26 секунд (16.11.2009 - 13:37) FatCat написал(а):
Цитата (MainVoid @ 15.11.2009 - 23:44)
Switch имхо более удобочитабелен

Самый читабельный и самый быстрый будет eval по массиву:
$action = array(
'условие1' => 'действие1',
'условие2' => 'действие2',
'условие3' => 'действие3',
);

eval($action[ $_GET['act'] ]);

Но тут вопрос безопасности.

Спустя 27 минут, 43 секунды (16.11.2009 - 14:05) MainVoid написал(а):
true

Спустя 12 минут, 43 секунды (16.11.2009 - 14:18) glock18 написал(а):
сомневаюсь, что eval хоть где-то может что-либо сделать более читаемым. тем более в случае с элементарным switch

Спустя 22 минуты, 45 секунд (16.11.2009 - 14:40) Семён написал(а):
Зачем замерять когда есть Benchmark тест, который определил всё до нас?

Спустя 11 минут, 57 секунд (16.11.2009 - 14:52) twin написал(а):
А зачем вообще кодить, когда есть дядя Расмус, который давно все знает за нас)))

Спустя 2 минуты, 36 секунд (16.11.2009 - 14:55) Семён написал(а):
Проверять и кодить две разные вещи dry.gif

Спустя 36 минут, 20 секунд (16.11.2009 - 15:31) twin написал(а):
Неее. Пока не пощупешь руками - не то. Мало ли где что и как. Своя рубаха ближе к телу. smile.gif

Спустя 2 часа, 10 минут, 35 секунд (16.11.2009 - 17:42) FatCat написал(а):
Цитата (glock18 @ 16.11.2009 - 15:18)
сомневаюсь, что eval хоть где-то может что-либо сделать более читаемым.

Тут не надо читать эваль, тут читабельный массив.
А выигрыш в скорости потому, что вообще не требуется операций сравнения и присвоения, одно лишь считывание файла пхп. Быстрее уже просто некуда.

Спустя 1 час, 8 минут, 16 секунд (16.11.2009 - 18:50) glock18 написал(а):
FatCat
требуется выделение памяти под этот массив.


Спустя 1 час, 33 минуты, 45 секунд (16.11.2009 - 20:24) FatCat написал(а):
Цитата (glock18 @ 16.11.2009 - 19:50)
требуется выделение памяти под этот массив

Естественно. Если мы выиграли в нагрузке на процессор и в быстродействии, в чем-то должны же проиграть.


_____________
-Oh My God! They Killed Kenny!
-You Bastards!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.