Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: C++ что выгоднее, switch или множественный if в выборе из 3?  (Прочитано 4085 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн actics

  • Новичок
  • *
  • Сообщений: 36
    • Просмотр профиля
Это все сильно зависит от компилятора. Как уже было замечено, бессмысленно запариваться над такими мелочами, когда пишешь на высокоуровненых языках, ладно С, но я видел людей которые пытаются проводить подобную оптимизация на питоне :D Но мне стало интересно.  :)

Проведем тест. Напишем 2 наиболее примитивные программы:
int main(void) {
    char temp = 0;
    switch(temp) {
        case 0:  write(0, "0", 1);
                 break;
        case 1:  write(0, "1", 1);
                 break;
        default: write(0, "2", 1);
    }
    return 0;
}

int main(void) {
    char temp=0;
    if (temp == 0)
        write(0, "0", 1);
    else if (temp == 1)
        write(0, "1", 1);
    else
        write(0, "2", 1);
    return 0;
}

А теперь дизассемблируем обе и посмотрим на main:

00000000004004fc <main>:
  4004fc: 55                    push   %rbp
  4004fd: 48 89 e5              mov    %rsp,%rbp
  400500: 48 83 ec 10          sub    $0x10,%rsp
  400504: c6 45 ff 00          movb   $0x0,-0x1(%rbp)
  400508: 0f be 45 ff          movsbl -0x1(%rbp),%eax
  40050c: 85 c0                test   %eax,%eax
  40050e: 74 07                je     400517 <main+0x1b>
  400510: 83 f8 01              cmp    $0x1,%eax
  400513: 74 1d                je     400532 <main+0x36>
  400515: eb 36                jmp    40054d <main+0x51>
  400517: ba 01 00 00 00        mov    $0x1,%edx
  40051c: be 14 06 40 00        mov    $0x400614,%esi
  400521: bf 00 00 00 00        mov    $0x0,%edi
  400526: b8 00 00 00 00        mov    $0x0,%eax
  40052b: e8 b0 fe ff ff        callq  4003e0 <write@plt>
  400530: eb 34                jmp    400566 <main+0x6a>
  400532: ba 01 00 00 00        mov    $0x1,%edx
  400537: be 16 06 40 00        mov    $0x400616,%esi
  40053c: bf 00 00 00 00        mov    $0x0,%edi
  400541: b8 00 00 00 00        mov    $0x0,%eax
  400546: e8 95 fe ff ff        callq  4003e0 <write@plt>
  40054b: eb 19                jmp    400566 <main+0x6a>
  40054d: ba 01 00 00 00        mov    $0x1,%edx
  400552: be 18 06 40 00        mov    $0x400618,%esi
  400557: bf 00 00 00 00        mov    $0x0,%edi
  40055c: b8 00 00 00 00        mov    $0x0,%eax
  400561: e8 7a fe ff ff        callq  4003e0 <write@plt>
  400566: b8 00 00 00 00        mov    $0x0,%eax
  40056b: c9                    leaveq
  40056c: c3                    retq   
  40056d: 0f 1f 00              nopl   (%rax)

00000000004004fc <main>:
  4004fc: 55                    push   %rbp
  4004fd: 48 89 e5              mov    %rsp,%rbp
  400500: 48 83 ec 10          sub    $0x10,%rsp
  400504: c6 45 ff 00          movb   $0x0,-0x1(%rbp)
  400508: 80 7d ff 00          cmpb   $0x0,-0x1(%rbp)
  40050c: 75 1b                jne    400529 <main+0x2d>
  40050e: ba 01 00 00 00        mov    $0x1,%edx
  400513: be 14 06 40 00        mov    $0x400614,%esi
  400518: bf 00 00 00 00        mov    $0x0,%edi
  40051d: b8 00 00 00 00        mov    $0x0,%eax
  400522: e8 b9 fe ff ff        callq  4003e0 <write@plt>
  400527: eb 3a                jmp    400563 <main+0x67>
  400529: 80 7d ff 01          cmpb   $0x1,-0x1(%rbp)
  40052d: 75 1b                jne    40054a <main+0x4e>
  40052f: ba 01 00 00 00        mov    $0x1,%edx
  400534: be 16 06 40 00        mov    $0x400616,%esi
  400539: bf 00 00 00 00        mov    $0x0,%edi
  40053e: b8 00 00 00 00        mov    $0x0,%eax
  400543: e8 98 fe ff ff        callq  4003e0 <write@plt>
  400548: eb 19                jmp    400563 <main+0x67>
  40054a: ba 01 00 00 00        mov    $0x1,%edx
  40054f: be 18 06 40 00        mov    $0x400618,%esi
  400554: bf 00 00 00 00        mov    $0x0,%edi
  400559: b8 00 00 00 00        mov    $0x0,%eax
  40055e: e8 7d fe ff ff        callq  4003e0 <write@plt>
  400563: b8 00 00 00 00        mov    $0x0,%eax
  400568: c9                    leaveq
  400569: c3                    retq   
  40056a: 66 0f 1f 44 00 00    nopw   0x0(%rax,%rax,1)

Как и следовало ожидать, сыграть на таких различиях не будут пытаться, скорее всего, даже при написании прог для ракет :) Но со свитчами ассемблерный код получился более читабельным (это скорее минус). Ещё тоже важно понимать, что компиляторы умеют некоторые вещи оптимизировать, поэтому бинарик может различаться при малейших изменениях.

К финалу: пишите хороший, читабельный код, а не думайте о ерунде. перфекционизм в таких местах ни к чему.  ;)

Шинш

  • Автор темы
  • Гость
actics,
den4ik_13rus,
mastepaner,
Protopopulus,

спасибо за объяснения_)) не зря топ заводил))

Оффлайн pipe

  • Администратор
  • Старожил
  • *
  • Сообщений: 5843
    • Просмотр профиля

 

Страница сгенерирована за 0.03 секунд. Запросов: 26.