Форум программистов, компьютерный форум CyberForum.ru

что быстрее работать будет?? - C++

Восстановить пароль Регистрация
 
laplas
15 / 11 / 1
Регистрация: 25.12.2010
Сообщений: 91
04.05.2012, 12:07     что быстрее работать будет?? #1
Здравствуйте)

проблема такая. есть функция, возвращаемое значение которой расчитывается по разным формулам, выбор которых зависит от входного параметра. так вот вопрос. есть ли вообще разница между
C++
1
2
3
4
5
6
7
8
9
10
double f (double x, int q)
{
       switch(q)
      {
              case 0: return ...;
              case 1: return ...;
              case 2: return ...;
              ...   
      }
}
и
C++
1
2
3
4
5
6
7
double f (double x, int q)
{
              if (q==0) return ...;
              if (q==1) return ...;
              if (q==2) return ...;
              ...   
}
???

или есть более эффективный метод?
спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andy_111
90 / 59 / 1
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 12:21     что быстрее работать будет?? #2
А вы не пробовали запустить в цикле свою функцию в разных вариантах и зафиксировать время, за которое она выполняется для каждого варианта? Ну и сравнить.
laplas
15 / 11 / 1
Регистрация: 25.12.2010
Сообщений: 91
04.05.2012, 12:33  [ТС]     что быстрее работать будет?? #3
Цитата Сообщение от andy_111 Посмотреть сообщение
А вы не пробовали запустить в цикле свою функцию в разных вариантах и зафиксировать время, за которое она выполняется для каждого варианта? Ну и сравнить.
не пробовал.
эта функция участвует много раз в процессе вычисления. поэтому я подумал, что доли секунды разницы сыграют роль на эффективности всего кода.
кстати выбор из 4 элементов.
я знаю, что switch и if имеют линейную скорость
но соответствует ли это моему случаю?
andy_111
90 / 59 / 1
Регистрация: 03.07.2011
Сообщений: 148
04.05.2012, 12:37     что быстрее работать будет?? #4
Мне кажется, на подобные вопросы ответы можно получить лишь практическими исследованиями, так как все зависит от версии и настроек компилятора. Проще засечь время и запустить программу в разных вариантах. Лучше конечно это делать на чистой системе - чтобы по минимуму влияла работа всяких сторонних программ, запускающихся в произвольные моменты времени. Измерения для каждого варианта проводить несколько раз, вычислив потом среднее.
laplas
15 / 11 / 1
Регистрация: 25.12.2010
Сообщений: 91
04.05.2012, 12:41  [ТС]     что быстрее работать будет?? #5
понял.
спасибо
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.05.2012, 12:51     что быстрее работать будет?? #6
Почти уверен, что будет быстрее с switch, так как там используются переходы по меткам вместе ветвлений.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 13:38     что быстрее работать будет?? #7
switch должен быть быстрее, ибо его проще оптимизировать, однако это слишком ничтожная оптимизация, чтобы обращать на нее внимание.
laplas
15 / 11 / 1
Регистрация: 25.12.2010
Сообщений: 91
04.05.2012, 13:40  [ТС]     что быстрее работать будет?? #8
Цитата Сообщение от diagon Посмотреть сообщение
switch должен быть быстрее, ибо его проще оптимизировать, однако это слишком ничтожная оптимизация, чтобы обращать на нее внимание.
даже если вызывать функцию 500 раз?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 13:41     что быстрее работать будет?? #9
Цитата Сообщение от laplas Посмотреть сообщение
даже если вызывать функцию 500 раз?
Именно так.
Вот если бы хотя бы порядка на 4 побольше - то можно было бы задуматься. А так заметной разницы не будет.
laplas
15 / 11 / 1
Регистрация: 25.12.2010
Сообщений: 91
04.05.2012, 13:54  [ТС]     что быстрее работать будет?? #10
Цитата Сообщение от diagon Посмотреть сообщение
Именно так.
Вот если бы хотя бы порядка на 4 побольше - то можно было бы задуматься. А так заметной разницы не будет.
спасибо. успокоили.
andry-raser
6 / 6 / 0
Регистрация: 04.12.2011
Сообщений: 35
04.05.2012, 14:12     что быстрее работать будет?? #11
Да да ,полностью согласен с выше сказанным , это логично поскольку у тебя if ,будет проверяться 3 раза !всегда! , а в свитче оно по ветке пошло и вуаля.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 14:46     что быстрее работать будет?? #12
Цитата Сообщение от andry-raser Посмотреть сообщение
Да да ,полностью согласен с выше сказанным , это логично поскольку у тебя if ,будет проверяться 3 раза !всегда! , а в свитче оно по ветке пошло и вуаля.
switch так же работает
C++
1
2
3
4
5
6
7
8
9
10
switch(x)
{
    case 1:
        //..
        break;
    
    case 2:
        //
        break;
}
практически эквивалентно
C++
1
2
3
4
if ( x == 1 )
    //
if ( x == 2 )
    //
Но switch все же проще оптимизировать, например, можно не проверять каждое условие, а пройтись по ним бинарным поиском.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.05.2012, 14:54     что быстрее работать будет?? #13
diagon, если бы было эквивалентно то можно было бы использовать не только константные выражения в case. Там используются переходы по типу goto.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 14:57     что быстрее работать будет?? #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Там используются переходы по типу goto.
Ну да. Только условные переходы. А if и есть условный переход.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.05.2012, 15:01     что быстрее работать будет?? #15
Нет, не условные. goto не условный переход. Кроме оценки выражения в switch () ничего не оценивается. Сразу goto к метке. Никак условных переходов.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 15:12     что быстрее работать будет?? #16
Попробуйте сами реализовать переход по нужной метке без проверки условий... Не получится же. По крайней мере у gcc не получается.

После компиляции этого кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main()
{
    int a;
    std::cin >> a;
    
    switch (a)
    {
        case 1:
            std::cout << "1";
        
        case 2:
            std::cout << "2";
        
        default:
            std::cout << "hmm";
    }
    
    std::cout << std::endl;
}
Можно найти в ассемблерном листинге следующий фрагмент
Assembler
1
2
3
4
cmpl    $1, %eax ;проверка на равенство
je  .L3 ;условный переход
cmpl    $2, %eax
je  .L4
UPD: забыл break'и поставить, однако ситуацию они не изменят.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
04.05.2012, 15:29     что быстрее работать будет?? #17
Странно, а компилировалось с опциями оптимизации? Я уже не помню где про это читал. Возможно зависит от компилятора, вечером перечитаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2012, 15:34     что быстрее работать будет??
Еще ссылки по теме:

C++ Что выполняется быстрее?
C++ Умножение - что быстрее
C++ Что быстрее: i++ или ++i ?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 15:34     что быстрее работать будет?? #18
Цитата Сообщение от Toshkarik Посмотреть сообщение
Странно, а компилировалось с опциями оптимизации? Я уже не помню где про это читал. Возможно зависит от компилятора, вечером перечитаю.
Только с -O3
P.S. и я таки был прав:
увеличил количество условий в switch'e, в итоге компилятор стал их проверять бинарным поиском, или чем-то вроде этого(во всяком случае, в коде куча проверок на больше/меньше)
Переписал код с этими же условиями, но только через if'ы - никакого бинарного поиска, тупо перебор всех условий.
В принципе это может оказаться полезным, например, если у вас 1024 условия в switch'e, то в худшем случае с тупым перебором вы получите 1024 проверки, а если бинарный поиск - то всего лишь 10 проверок. Ну а если у вас не более 10 условий, то, повторюсь, разница будет незаметна.
Yandex
Объявления
04.05.2012, 15:34     что быстрее работать будет??
Ответ Создать тему
Опции темы

Текущее время: 07:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru