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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
laplas
15 / 11 / 1
Регистрация: 25.12.2010
Сообщений: 91
#1

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

04.05.2012, 12:07. Просмотров 863. Ответов 17
Метки нет (Все метки)

Здравствуйте)

проблема такая. есть функция, возвращаемое значение которой расчитывается по разным формулам, выбор которых зависит от входного параметра. так вот вопрос. есть ли вообще разница между
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 ...;
              ...   
}
???

или есть более эффективный метод?
спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2012, 12:07     что быстрее работать будет??
Посмотрите здесь:

Перевод в 2 сс (какой способ будет быстрее работать) - C++
Какой способ будет быстрее работать? Тривиальный, когда мы берем остатки, или такой - std::bitset <sizeof(Type) * 8> my(n); ...

Проверить, станет ли программа работать быстрее, благодаря сделанной оптимизации - C++
Имеется код (отрывок): int len = str.length(); int count = 0, i=0; while (i<len-1 ) { if (!isBig(str, i)) count++;...

Что выполняется быстрее? - C++
Что выполняется быстрее (в первом случае идет вычисление адреса элемента массива, а во втором вычисляется сам элемент, причем известно что...

Умножение - что быстрее - C++
1) a = 0; a = x * y; 2)a = 0; for (int i = 0; i < y; ++i) { a += x; } И, если второй вариант быстрее, при каких Y он...

Что работает быстрее? - C++
Подскажите пожалуйста, какая из данных реализаций будет работать бытрее? int a = 5; int b = 3; int c = 4; int d,e,f; ...

Что быстрее: i++ или ++i ? - C++
Только что прочитала в интернете, что префиксный итератор быстрее, чем постфиксный. Так ли это? Если так и если в С++ все есть обьект, то...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
andy_111
90 / 59 / 2
Регистрация: 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 / 2
Регистрация: 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.05.2012, 12:51     что быстрее работать будет?? #6
Почти уверен, что будет быстрее с switch, так как там используются переходы по меткам вместе ветвлений.
diagon
Higher
1927 / 1193 / 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
1927 / 1193 / 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
1927 / 1193 / 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.05.2012, 14:54     что быстрее работать будет?? #13
diagon, если бы было эквивалентно то можно было бы использовать не только константные выражения в case. Там используются переходы по типу goto.
diagon
Higher
1927 / 1193 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
04.05.2012, 14:57     что быстрее работать будет?? #14
Цитата Сообщение от Toshkarik Посмотреть сообщение
Там используются переходы по типу goto.
Ну да. Только условные переходы. А if и есть условный переход.
Toshkarik
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.05.2012, 15:01     что быстрее работать будет?? #15
Нет, не условные. goto не условный переход. Кроме оценки выражения в switch () ничего не оценивается. Сразу goto к метке. Никак условных переходов.
diagon
Higher
1927 / 1193 / 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
04.05.2012, 15:29     что быстрее работать будет?? #17
Странно, а компилировалось с опциями оптимизации? Я уже не помню где про это читал. Возможно зависит от компилятора, вечером перечитаю.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2012, 15:34     что быстрее работать будет??
Еще ссылки по теме:

Что работает быстрее? - C++
Здравствуйте! Друзья, что лучше (правильнее) использовать: for(int i=0; i&lt;strlen(ABC); ++i) {} или int i=0; int...

Правда что С быстрее чем С++? - C++
Имеется в виду на исполнении, а не на момент компиляции... Наверняка такая тема уже была, но я не нашёл, если дадите ссылку также буду...

Что быстрее assembler или c++ - C++
Вопрос от новичка. Что будет быстрее по скорости выполнения и на сколько: 1) сложить a+b на C++ или на assembler 2) умножить a*b на C++...

If или switch().case. Что быстрее - C++
Есть два кода. Первый: if(a == 2) a += 2; if(a == 3) a+= 3; if(a == 4) a+=4; Второй:


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

Или воспользуйтесь поиском по форуму:
diagon
Higher
1927 / 1193 / 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     что быстрее работать будет??
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru