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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
ZaxarPal
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
#1

Целесообразность использования цикла. - C++

18.10.2011, 01:43. Просмотров 1269. Ответов 22
Метки нет (Все метки)

Этот момент в универе нам не объясняли. Хочу сразу сказать, я знаю зачем, как и когда используются циклы. Собственно возник не большой спор. Какое преимущество будет иметь код
C++
1
2
for (int i = 0; i < 10; ++i)
    <действие>
перед просто десятью строками типа
C++
1
2
3
4
<действие>
<действие>
<действие>
<действие>
?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2011, 01:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Целесообразность использования цикла. (C++):

Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) - C++
Задание звучит так: Карточка лотереи имеет нумерованные поля, из которых случайным образом выбирается определенное количество ...

Шейкерная сортировка без использования while цикла - C++
Ребят, сделал шейкерную сортировку через два вложенных цикла - не работает. Не могу понять в чем проблема, подскажите пожалуйста. ...

Ознакомиться с операторами цикла их видами и правилами их использования - C++
Ознакомиться с операторами цикла их видами и правилами их использования. y(x)=(cos(d+x)+cx)/(ax+b), x=-1(0.2)1

Опишите сходство и различие использования операторов цикла for, while - C++
0пишите сходство и различие использования операторов цикла for, while и do ... while. Приведите примеры.

Как обойти массив без использования цикла - C++
С помощью рекурсии

Вывод массива без использования цикла на C(pure)) - C++
Какие есть мысли и/или готовые решения по сабжу ?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
18.10.2011, 03:59 #2
1) сокращается текст программы
2) в больших программах i может быть больше чем 10, к примеру 100, и тогда будет уже затруднительно писать 100 раз одно и тоже (просто надоест)
NegativeCreep
1 / 1 / 0
Регистрация: 30.06.2010
Сообщений: 19
18.10.2011, 04:19 #3
Цикл можно расписать как
C++
1
2
3
4
int i=0;
if(++i<10)<действие>
if(++i<10)<действие>//и так 10 раз
...
По сути получаем еще десять сравнений, и плюс объявление и присваивание значения переменной i
Bers
Заблокирован
18.10.2011, 08:30 #4
ZaxarPal, однозначно, что первый вариант даёт бонус на этапе написания исходного кода.

А дальше нужно смотреть во что скомпилируются оба варианта.

Вполне возможно, что первый вариант после компиляции примет такой же вид, как и второй.
Тогда можно будит сказать, что второй вариант не даёт никаких бонусов.
ZaxarPal
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
18.10.2011, 08:59  [ТС] #5
Вопрос в том, будет ли преимущество по использованию ресурсов системы программой с циклом перед программой без. Т.е. меньше операций процессора, меньше использования оперативки и т.д.
Bers
Заблокирован
18.10.2011, 09:10 #6
Цитата Сообщение от ZaxarPal Посмотреть сообщение
Вопрос в том, будет ли преимущество по использованию ресурсов системы программой с циклом перед программой без. Т.е. меньше операций процессора, меньше использования оперативки и т.д.
Цитата Сообщение от Bers Посмотреть сообщение
А дальше нужно смотреть во что скомпилируются оба варианта.
Вполне возможно, что первый вариант после компиляции примет такой же вид, как и второй.
Тогда можно будит сказать, что второй вариант не даёт никаких бонусов.
Ещё раз вам говорю, зависит от компилятора с его настройками.
После его оптимизаций, вполне возможно что конечный код вообще изменится до неузнаваемости.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 10:51 #7
Оптимизирующие компиляторы умеют разворачивать даже "длинные" циклы. В данном случае важно, какие операции выполняются в блоке <действие>. Т.е. если там очень сложные вычисления, то экономия одного if на итерацию ничего не даст. Если же сложность действия сопоставима со сложностью условия, то компилятор может принять решение о необходимости развернуть цикл.
В большинстве случаев лапша быстрее цикла. Во многих случаях это преимущество несущественно.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
18.10.2011, 10:59 #8
Цитата Сообщение от ZaxarPal Посмотреть сообщение
Этот момент в универе нам не объясняли. Хочу сразу сказать, я знаю зачем, как и когда используются циклы. Собственно возник не большой спор. Какое преимущество будет иметь код
C++
1
2
for (int i = 0; i < 10; ++i)
    <действие>
перед просто десятью строками типа
C++
1
2
3
4
<действие>
<действие>
<действие>
<действие>
?
1. Цикл компактнее в исходинке. А что компактнее в исходнике, то быстрее пишется и читается.
2. Цикл компактнее в коде. А что компактнее в коде, то может быстрее исполняться.
3. В цикле можно быстро поменять число повторов, в том числе, с клавиатуры, или по результатам других операций.
Но циклы не всегда целесообразны. Иногда приходится вручную повторять текст тела цикла вместо написания самого цикла и именно ради быстрого исполнения.
Deviaphan
18.10.2011, 11:07
  #9

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
А что компактнее в коде, то может быстрее исполняться.
Оптимизированные по скорости программы обычно больше оптимизированных по размеру.

Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 11:10 #10
ZaxarPal, смотря для чего это вам. Например, при программной реализации симметричных шифров стараются избегать циклы раундовых преобразований. Вместо for(...) a[i] так и пишут a[0], a[1]... Снимется зависимость от оптимизации компилятора и код работает быстрее.
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
18.10.2011, 11:17 #11
Цитата Сообщение от taras atavin Посмотреть сообщение
2. Цикл компактнее в коде. А что компактнее в коде, то может быстрее исполняться.
Уверенности нет. Ключевое слово может.
Приходилось заменять цикл строками для экономии времени исполнения.
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.10.2011, 11:39 #12
Цитата Сообщение от Mustik Посмотреть сообщение
Уверенности нет. Ключевое слово может.
Приходилось заменять цикл строками для экономии времени исполнения.
А что же это такое вы пишете, что циклы вас по времени не устраивают?
Насколько я знаю, циклы реализовываются примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main()
{
    int arr[] = { 1, 2, 3 };
    
    int i = 0;
begin:
    std::cout << arr[i] << ' ';
    ++i;
    if ( i < 3 )
        goto begin;
}
Т.е. в худшем случае будет проверяться одно условие. Этот цикл просто для примера взял, потому что любой вменяемый компилятор превратит его в 3 строчки вывода.
Приведите пример, при котором будет хоть как-то чувствоваться улучшение быстродействия, если цикл заменить на последовательность действий. Может, такой и существует, самому интересно.
И это уже не говоря о том, что далеко не всегда можно заменить цикл(рекурсия не в счет, она еще менее эффективна).
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.10.2011, 11:41 #13
Цитата Сообщение от diagon Посмотреть сообщение
(рекурсия не в счет, она еще менее эффективна
Это смотря с какой стороны посмотреть, знаете ли
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 11:51 #14
Цитата Сообщение от diagon Посмотреть сообщение
Т.е. в худшем случае будет проверяться одно условие
Тут суть не в уменьшении на один иф с каждой итерации, а в том, что устраняется ветвление, то есть предиктор на 100% не ошибается, не требуется очистка и перезаполнение конвеера и т.д. Кроме того, если итерации не зависимы между собой, то благодаря всё тому же конвееру, операции могут выполняться "одновременно".
Если в цикле сложное условие, то предиктор может часто ошибаться и производительность никакущая будет.
Последовательный код всегда быстрее кода с ветвлениями, без вариантов.

Цитата Сообщение от diagon Посмотреть сообщение
екурсия не в счет, она еще менее эффективна
Рекурсивные функции могут "инлайница" образуя последовательный код, более эффективный, чем цикл. Ну и разговоры о взаимозаменяемости циклов и рекурсии это просто теоретическое балаболство.)
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.10.2011, 12:04 #15
Цитата Сообщение от fasked Посмотреть сообщение
Это смотря с какой стороны посмотреть, знаете ли
Для каких-нибудь алгоритмов да, но здесь же речь идет о элементарном цикле, а один jmp явно эффективнее вызова функции будет.


Цитата Сообщение от Deviaphan Посмотреть сообщение
Тут суть не в уменьшении на один иф с каждой итерации, а в том, что устраняется ветвление, то есть предиктор на 100% не ошибается, не требуется очистка и перезаполнение конвеера и т.д. Кроме того, если итерации не зависимы между собой, то благодаря всё тому же конвееру, операции могут выполняться "одновременно".
Если в цикле сложное условие, то предиктор может часто ошибаться и производительность никакущая будет.
Последовательный код всегда быстрее кода с ветвлениями, без вариантов.
Я видимо чего-то не понимаю, но, насколько я понял, речь шла о элементарном цикле, который выполняет n(причем n - const) действий. Не могу представить другой задачи, в которой цикл можно заменить на последовательность действий.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2011, 12:04
Привет! Вот еще темы с ответами:

Составить циклические программы без использования операторов цикла - C++
Составить алгоритм программы для вычисления суммы без использования массивов и операторов цикла. Написать программу для вычисления суммы. ...

Возможно ли без использования цикла получить символ с конца нулевого аргумента main()? - C++
Использую имя файла как аргумент для предварительной настройки программы. Хочу без помощи поиска в цикле получить пред-пред-пред последний...

Целесообразность перегрузки оператора - C++
Изначально имелся такой вот метод (пусть будет методом класса &quot;A&quot;): //класс &quot;A&quot;, константная версия метода const Order &amp;operator...

Целесообразность написания дополнительных скобок или "с чем плюсы вкуснее?" - C++
Ну, Вам правильно ответили, но второе условие и так будет исполняться. Т.е. если текст не пустой, то будет срабатывать любое из значений, а...


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

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

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