За последние 24 часа нас посетили 17817 программистов и 1622 робота. Сейчас ищут 972 программиста ...

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

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

  1. OdieZlo

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

    С нами с:
    1 ноя 2008
    Сообщения:
    14
    Симпатии:
    0
    Всем доброго времени суток!
    Вопрос может быть глупый, и возможно уже задавался на этом форуме… (если да то прошу прощения!)…
    Ну рас уж я начал, то осмелюсь спросить… так чем же всё таки лучше пользоваться, if else или switch case, и действительно ли это глупо:? Я имею в веду, стоит ли задумываться над тем сколько времени затратит сервер на выполнение этих операций:?
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    нет
     
  3. OdieZlo

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

    С нами с:
    1 ноя 2008
    Сообщения:
    14
    Симпатии:
    0
    Sergey89
    Спасибо за доклад, будет время я обзательно с ним ознакомлюсь! LoL
    Не ну то что нужно задумываться о времени обработки скрипта я и так понимаю, но тут я имел в веду именно эти два оператора, то есть, по времени обработки они похожи или один из них быстрее:?
     
  4. Hirurgkk

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

    С нами с:
    17 мар 2009
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Во... У меня вопрос по почти похожей теме =) Сорь, просто, чтобы новую не создавать...
    У меня есть выбор именно из 2х вариантов:
    1. На хостинге есть подключение к БД. Мне надо подключиться к другой базе на другом компе и потом естественно обратно на начальную БД. С БД, что на другом компе, надо достать некоторые данные.
    2. С помощью функции file_get_contents() получить данные с файла, который находится на другом компе. Этот файл соответственно там подключается локально к БД и возвращает некоторые данные.
    Так вот... Что из этого будет быстрее?
     
  5. Hirurgkk

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

    С нами с:
    17 мар 2009
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    OdieZlo
    Конструкция if..else должна быть быстрее, хотя бы потому, что она базовая и простая. А switch был введён позже, т.к. конструкция if иногда становится неэффективной и => switch сложнее.
    Вот такие у меня выводы :-D
     
  6. akrinel

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

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    По данному вопросу я полностью согласен с vasa_c.

    По сабжу: что мешает просто взять и проверить?
     
    askanim нравится это.
  7. Alost

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Нету исследовательского интереса)

    По быстрому протестил, каждый тест это 10 If или 10 case. прогон 100к раз, для вычисление среднего времени 10 тестов.
    Результат:
    Код (Text):
    1.  
    2. Avarege If:     0.267175722122 sec
    3. Avarege switch: 0.552626991272 sec
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    общее время 100 тысячи тестов
    Код (Text):
    1. if: 0.12033
    2. switch: 0.12303
     
  9. Alost

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Код теста в студию) посмотрим в равных ли условиях билиcь if и switch)
     
  10. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. $s = microtime(true);
    3. for ($i = 0; $i < 100000; $i++) {
    4.     test_if($i);
    5. }
    6. printf('if: %.5f<br />', microtime(true) - $s);
    7.  
    8. $s = microtime(true);
    9. for ($i = 0; $i < 100000; $i++) {
    10.     test_switch($i);
    11. }
    12. printf('switch: %.5f', microtime(true) - $s);
    13.  
    14. function test_if($x) {
    15.     $y = 0;
    16.  
    17.     if ($x == 1) {
    18.         $y = $x * 1;
    19.     } elseif ($x == 2) {
    20.         $y = $x * 2;
    21.     } elseif ($x == 3) {
    22.         $y = $x * 3;
    23.     } elseif ($x == 4) {
    24.         $y = $x * 4;
    25.     } elseif ($x == 5) {
    26.         $y = $x * 5;
    27.     } elseif ($x == 6) {
    28.         $y = $x * 6;
    29.     } elseif ($x == 7) {
    30.         $y = $x * 7;
    31.     } elseif ($x == 8) {
    32.         $y = $x * 8;
    33.     } elseif ($x == 9) {
    34.         $y = $x * 9;
    35.     } elseif ($x == 10) {
    36.         $y = $x * 10;
    37.     } else {
    38.         $y = $x * $x;
    39.     }
    40.  
    41.     return $y;
    42. }
    43.  
    44. function test_switch($x) {
    45.     $y = 0;
    46.    
    47.     switch ($x) {
    48.         case 1:
    49.             $y = $x * 1;
    50.         break;
    51.         case 2:
    52.             $y = $x * 2;
    53.         break;
    54.         case 3:
    55.             $y = $x * 3;
    56.         break;
    57.         case 4:
    58.             $y = $x * 4;
    59.         break;
    60.         case 5:
    61.             $y = $x * 5;
    62.         break;
    63.         case 6:
    64.             $y = $x * 6;
    65.         break;
    66.         case 7:
    67.             $y = $x * 7;
    68.         break;
    69.         case 8:
    70.             $y = $x * 8;
    71.         break;
    72.         case 9:
    73.             $y = $x * 9;
    74.         break;
    75.         case 10:
    76.             $y = $x * 10;
    77.         break;
    78.         default:
    79.             $y = $x * $x;
    80.     }
    81.  
    82.     return $y;
    83. }
     
  11. Alost

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Все честно, победа присуждаеться If 8) Все счастливы все довольны)
     
  12. Ti

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

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

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Табличные методы непричем в споре switch VS if
     
  14. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    очень даже причем
     
  15. Sindicat

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

    С нами с:
    10 фев 2009
    Сообщения:
    46
    Симпатии:
    0
    вроде они оба хорошы и спора не может быть ! где - то легче switch использовать чем if else и наоборот
     
  16. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    if бытрее, так как печатать меньше ;)
     
  17. Alost

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    А точнее.
     
  18. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Ха ха ха, прикольный мужик.
     
  19. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Табличный метод не только лаконичней но и работает быстрее:

    PHP:
    1. <?
    2. $s = microtime(true);
    3. for ($i = 0; $i < 100000; $i++) {
    4.     test_if(($i % 12)+1);
    5. }
    6. printf('if: %.5f<br />', microtime(true) - $s);
    7.  
    8. $s = microtime(true);
    9. for ($i = 0; $i < 100000; $i++) {
    10.     test_switch(($i % 12)+1);
    11. }
    12. printf('switch: %.5f<br />', microtime(true) - $s);
    13.  
    14. $s = microtime(true);
    15. for ($i = 0; $i < 100000; $i++) {
    16.     test_table(($i % 12)+1);
    17. }
    18. printf('table: %.5f<br />', microtime(true) - $s);
    19.  
    20. function test_if($x) {
    21.     $y = 0;
    22.  
    23.     if ($x == 1) {
    24.         $y = 'Январь';
    25.     } elseif ($x == 2) {
    26.         $y = 'Февраль';
    27.     } elseif ($x == 3) {
    28.         $y = 'Март';
    29.     } elseif ($x == 4) {
    30.         $y = 'Апрель';
    31.     } elseif ($x == 5) {
    32.         $y = 'Май';
    33.     } elseif ($x == 6) {
    34.         $y = 'Июнь';
    35.     } elseif ($x == 7) {
    36.         $y = 'Июль';
    37.     } elseif ($x == 8) {
    38.         $y = 'Август';
    39.     } elseif ($x == 9) {
    40.         $y = 'Сентябрь';
    41.     } elseif ($x == 10) {
    42.         $y = 'Октябрь';
    43.     } elseif ($x == 11) {
    44.         $y = 'Ноябрь';
    45.     } elseif ($x == 12) {
    46.         $y = 'Декабрь';
    47.     } else {
    48.         $y = false;
    49.     }
    50.  
    51.     return $y;
    52. }
    53.  
    54. function test_switch($x) {
    55.     $y = 0;
    56.  
    57.     switch ($x) {
    58.         case 1:
    59.             $y = 'Январь';
    60.             break;
    61.         case 2:
    62.             $y = 'Февраль';
    63.             break;
    64.         case 3:
    65.             $y = 'Март';
    66.             break;
    67.         case 4:
    68.             $y = 'Апрель';
    69.             break;
    70.         case 5:
    71.             $y = 'Май';
    72.             break;
    73.         case 6:
    74.             $y = 'Июнь';
    75.             break;
    76.         case 7:
    77.             $y = 'Июль';
    78.             break;
    79.         case 8:
    80.             $y = 'Август';
    81.             break;
    82.         case 9:
    83.             $y = 'Сентябрь';
    84.             break;
    85.         case 10:
    86.             $y = 'Октябрь';
    87.             break;
    88.         case 11:
    89.             $y = 'Ноябрь';
    90.             break;
    91.         case 12:
    92.             $y = 'Декабрь';
    93.             break;
    94.         default:
    95.             $y = false;
    96.     }
    97.  
    98.     return $y;
    99. }
    100.  
    101. function test_table($x) {
    102.     static $table = array(false, 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь');
    103.     if (isset($table[$x])) return $table[$x];
    104.     return false;
    105. }
     
  20. heapKiller

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

    С нами с:
    27 авг 2008
    Сообщения:
    95
    Симпатии:
    0
    Дедушка Кнут отдыхает - табличный метод рулит.

    зы Вам пора писать трехтомник (толстый) или диссертацию на тему - "преимущества табличного метода обработки информации".

    зы Смешно.
     
  21. Ti нет смысла что-то доказывать баранам:
    1. им это не нужно
    2. это трата твои усилий.
     
  22. Alost

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

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    флоппик
    Кстати не соглашусь,я часто читая топики где как ты говоришь доказывают что то баранам,нахожу полезную для себя информацию
    Неудобно копытами печатать...
    Ti
    Интересный подход, но на практике редко где получаеться использовать.Цель множественых ифов и свитча,это выполнить разные действия в зависимости от условий.
     
  23. Во многих реалтаймовых приложениях, где идут интенсивные мат. расчеты, синусы - косинусы и прочие функции для производительности ВСЕГДА считаются табличным методом. Во флеш играх, часто.
     
  24. shurastik

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

    С нами с:
    22 фев 2008
    Сообщения:
    285
    Симпатии:
    0
    Адрес:
    Латвия
    То есть для первого варианта табличный метод должен выглядеть так?

    PHP:
    1.  
    2. <?php
    3. function test_table($x) {
    4.     $table = array(false, $x, $x*2, $x*3, $x*4, $x*5, $x*6, $x*7, $x*8, $x*9, $x*10);
    5.     if (isset($table[$x])) return $table[$x];
    6.     return false;
    7. }
    8. ?>
    9.  
    Если так, то это далеко не быстрее...
     
  25. Универсальное решение только одно - пользоватся мозгом. Естественно умножение будет быстрее выполнятся просто так.