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

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

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

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

04.05.2012, 12:07. Просмотров 875. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос что быстрее работать будет?? (C++):

Что быстрее будет работать сравнение или (сложение и приведение типов)? - C++
Эти строчки if(h == 0xffffffff) { code_1 } else { code_2 } или if(h + 1) { code_2 } else { code_1 }

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

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

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

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

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

Если макрос на VBA переписать на С++, то макрос станет работать быстрее? - C++
Всем привет!) У меня есть макрос написанный в Екселе на VBA, если его переписать на С++ , то макрос станет работать быстрее? ...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.05.2012, 15:01
Ответ Создать тему
Опции темы

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