За последние 24 часа нас посетили 18582 программиста и 1678 роботов. Сейчас ищут 1059 программистов ...

что быстрее if иши switch

Тема в разделе "PHP для новичков", создана пользователем OdieZlo, 20 мар 2009.

  1. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Посмотрите любой "множественный иф" из реального приложения и поймете обратное.
     
  2. Septerrianin

    Septerrianin Новичок

    С нами с:
    15 авг 2018
    Сообщения:
    1
    Симпатии:
    0
    Некропостну тему. Поскольку задался таким же вопросом, а на дворе - php 7.2.8
    Ваш код не выдерживает критики. Ибо операционные затраты на вызов функций и постинкремент переменной в цикле - нивелируют разницу самого тестируемого блока.
    Я уж промолчу про то, что в вашем примере 99,999% циклов выполняется лишь самое последнее условие.
    "Немного" переделаем код, чтобы тест получился более чистым. Для 1 000 000 000 итераций:
    PHP:
    1. <?php
    2. $s = time();
    3. for ($i = 0; $i < 1000000000; ++$i) {
    4.   $x = $i%10;
    5.   if ($x == 1) {
    6.   $y = $x * 1;
    7.   } elseif ($x == 2) {
    8.   $y = $x * 2;
    9.   } elseif ($x == 3) {
    10.   $y = $x * 3;
    11.   } elseif ($x == 4) {
    12.   $y = $x * 4;
    13.   } elseif ($x == 5) {
    14.   $y = $x * 5;
    15.   } elseif ($x == 6) {
    16.   $y = $x * 6;
    17.   } elseif ($x == 7) {
    18.   $y = $x * 7;
    19.   } elseif ($x == 8) {
    20.   $y = $x * 8;
    21.   } elseif ($x == 9) {
    22.   $y = $x * 9;
    23.   } else {
    24.   $y = $x * 10;
    25.   }
    26. }
    27. print("if: ".(time() - $s)."sec\n");
    28.  
    29. $s = time();
    30. for ($i = 0; $i < 1000000000; ++$i) {
    31.   $x = $i%10;
    32.   switch ($x) {
    33.   case 1:
    34.   $y = $x * 1;
    35.   break;
    36.   case 2:
    37.   $y = $x * 2;
    38.   break;
    39.   case 3:
    40.   $y = $x * 3;
    41.   break;
    42.   case 4:
    43.   $y = $x * 4;
    44.   break;
    45.   case 5:
    46.   $y = $x * 5;
    47.   break;
    48.   case 6:
    49.   $y = $x * 6;
    50.   break;
    51.   case 7:
    52.   $y = $x * 7;
    53.   break;
    54.   case 8:
    55.   $y = $x * 8;
    56.   break;
    57.   case 9:
    58.   $y = $x * 9;
    59.   break;
    60.   default:
    61.   $y = $x * 10;
    62.   }
    63. }
    64. print("switch: ".(time() - $s)."sec\n");
    65. ?>
    Результат:
    if: 69sec
    switch: 42sec

    Счёт разгромный в пользу Switch.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ой, возродили престарелую тему. Ещё и бессмысленную
     
  4. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Чел с 2009 вёл расчёты чтобы только в 2018 году их здесь опубликовать)
     
  5. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Что быстрее for while или foreach? Ответ в 2027.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в js обратный фор на --1
     
  7. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Не могу сказать точно как в PHP. В сях быстродействие зависит (если не изменилось чего в новых компиляторах) от количества условий. Только, на сколько я помню, было наоборот - на малых количествах шустрее отрабатывали if на большом switch.... Вполне возможно, что зависит и от самих действий в теле.

    А вообще подобные тесты на самом деле "ни о чем".... Тут в каждой конкретной ситуации свои параметры.

    Уж тестить так тестить. :D
    PHP:
    1. $ar = [
    2.     0 => 10,
    3.     1 => 1,
    4.     2 => 2,
    5.     3 => 3,
    6.     4 => 4,
    7.     5 => 5,
    8.     6 => 6,
    9.     7 => 7,
    10.     8 => 8,
    11.     9 => 9,
    12. ];
    13. for ($i = 0; $i < 1000000000; ++$i) {
    14.   $x = $i%10;
    15.   $y = $x * (array_key_exists($x,$ar) ? $ar[$x] : $ar[0]);
    16. }
    17. print("arr: ".(time() - $s)."sec\n");
    18.  
    19. $ar = [
    20.     0 => function($x){return $x*10;},
    21.     1 => function($x){return $x*1;},
    22.     2 => function($x){return $x*2;},
    23.     3 => function($x){return $x*3;},
    24.     4 => function($x){return $x*4;},
    25.     5 => function($x){return $x*5;},
    26.     6 => function($x){return $x*6;},
    27.     7 => function($x){return $x*7;},
    28.     8 => function($x){return $x*8;},
    29.     9 => function($x){return $x*9;},
    30. ];
    31. for ($i = 0; $i < 1000000000; ++$i) {
    32.   $x = $i%10;
    33.   $y = array_key_exists($x,$ar) ? $ar[$x]($x) : $ar[0]($x);
    34. }
    35. print("func: ".(time() - $s)."sec\n");
    36. ?>
     
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL