Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83

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

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

Студворк — интернет-сервис помощи студентам
Этот момент в универе нам не объясняли. Хочу сразу сказать, я знаю зачем, как и когда используются циклы. Собственно возник не большой спор. Какое преимущество будет иметь код
C++
1
2
for (int i = 0; i < 10; ++i)
    <действие>
перед просто десятью строками типа
C++
1
2
3
4
<действие>
<действие>
<действие>
<действие>
?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.10.2011, 01:43
Ответы с готовыми решениями:

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

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

Обнуление динамического массива без использования цикла
Как обнулить дин. массив? (без цикла). Для определённого массива можно написать вот так: int array {}; А для динамического? Например int...

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

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

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

Не по теме:

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

1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
18.10.2011, 11:10
ZaxarPal, смотря для чего это вам. Например, при программной реализации симметричных шифров стараются избегать циклы раундовых преобразований. Вместо for(...) a[i] так и пишут a[0], a[1]... Снимется зависимость от оптимизации компилятора и код работает быстрее.
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
18.10.2011, 11:17
Цитата Сообщение от taras atavin Посмотреть сообщение
2. Цикл компактнее в коде. А что компактнее в коде, то может быстрее исполняться.
Уверенности нет. Ключевое слово может.
Приходилось заменять цикл строками для экономии времени исполнения.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.10.2011, 11:39
Цитата Сообщение от 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 строчки вывода.
Приведите пример, при котором будет хоть как-то чувствоваться улучшение быстродействия, если цикл заменить на последовательность действий. Может, такой и существует, самому интересно.
И это уже не говоря о том, что далеко не всегда можно заменить цикл(рекурсия не в счет, она еще менее эффективна).
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
18.10.2011, 11:41
Цитата Сообщение от diagon Посмотреть сообщение
(рекурсия не в счет, она еще менее эффективна
Это смотря с какой стороны посмотреть, знаете ли
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 11:51
Цитата Сообщение от diagon Посмотреть сообщение
Т.е. в худшем случае будет проверяться одно условие
Тут суть не в уменьшении на один иф с каждой итерации, а в том, что устраняется ветвление, то есть предиктор на 100% не ошибается, не требуется очистка и перезаполнение конвеера и т.д. Кроме того, если итерации не зависимы между собой, то благодаря всё тому же конвееру, операции могут выполняться "одновременно".
Если в цикле сложное условие, то предиктор может часто ошибаться и производительность никакущая будет.
Последовательный код всегда быстрее кода с ветвлениями, без вариантов.

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


Цитата Сообщение от Deviaphan Посмотреть сообщение
Тут суть не в уменьшении на один иф с каждой итерации, а в том, что устраняется ветвление, то есть предиктор на 100% не ошибается, не требуется очистка и перезаполнение конвеера и т.д. Кроме того, если итерации не зависимы между собой, то благодаря всё тому же конвееру, операции могут выполняться "одновременно".
Если в цикле сложное условие, то предиктор может часто ошибаться и производительность никакущая будет.
Последовательный код всегда быстрее кода с ветвлениями, без вариантов.
Я видимо чего-то не понимаю, но, насколько я понял, речь шла о элементарном цикле, который выполняет n(причем n - const) действий. Не могу представить другой задачи, в которой цикл можно заменить на последовательность действий.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 12:17
Цитата Сообщение от diagon Посмотреть сообщение
речь шла о элементарном цикле
Я вот не вижу ничего элементарного в записи <действие> .)
Выполняется 10 итераций с выполнением неизвестного объёма кода. Так что тут вообще говорить не о чем, только пространные предположения.)

Допустим, речь о инициализации массива из 10 элементов. цикл удобнее, но последовательное присваивание эффективнее. В относительных величинах - намного эффективнее. В абсолютных - несколько тактов процессора.

Добавлено через 2 минуты
Цитата Сообщение от diagon Посмотреть сообщение
Не могу представить другой задачи, в которой цикл можно заменить на последовательность действий.
Любой цикл с известным количеством итераций (известными до запуска цикла) можно развернуть.
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
18.10.2011, 12:34
Цитата Сообщение от Deviaphan Посмотреть сообщение
Допустим, речь о инициализации массива из 10 элементов. цикл удобнее
Здесь удобнее плоский стиль(видел такой термин где-то ) будет =)
C++
1
std::fill(arr, arr + 3, 0);

Цитата Сообщение от Deviaphan Посмотреть сообщение
но последовательное присваивание эффективнее
Чем? Вы же сами сказали
Цитата Сообщение от Deviaphan Посмотреть сообщение
Любой цикл с известным количеством итераций (известными до запуска цикла) можно развернуть.
Компилятор должен развернуть такой цикл, и в бинарном коде особой разницы быть не должно.
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
18.10.2011, 12:39
Цитата Сообщение от diagon Посмотреть сообщение
Компилятор должен развернуть такой цикл, и в бинарном коде особой разницы быть не должно.
Я как-то упустил из виду это утверждение.) Тогда да, никакой. Но только нужен хороший оптимизирующий компилятор.)

Добавлено через 1 минуту
С другой стороны, пока не залезешь в ассемблерный листинг не поймёшь, развернул он цикл или нет.
С ещё более другой стороны, если он цикл не развернул, то, вероятно, такой потребности не возникло.)
1
Заблокирован
18.10.2011, 12:46
Цитата Сообщение от Deviaphan Посмотреть сообщение
Допустим, речь о инициализации массива из 10 элементов. цикл удобнее, но последовательное присваивание эффективнее. В относительных величинах - намного эффективнее. В абсолютных - несколько тактов процессора.
Речь не о работе скомпилированного кода. Речь об оптимизации исходного кода самим человеком.

Если от "разворачивания" цикла будит ощутимый профит, неужели компилятор сам не догадается это сделать?


Одно дело оптимизировать принцип хранения данных (дата-ориентированное программирование)
Другое дело оптимизировать алгоритмы в узких местах.

И третье - пытаться ручками оптимизировать исходный код.

Можно сделать так:

int a=10; int b=a; int c=b; //типа в три действия

можно сделать так:

int a=10; int c=a; //типа в два действия

Но будит наивным полагать, что исходник с тремя действиями будит выполняться дольше. Скорее всего компилятор выбросит промежуточную переменную.

А может и все три переменные выбросит, если они так больше нигде и не будут использованы.
1
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
18.10.2011, 13:38  [ТС]
Вопрос был больше таки в том, как будет работать скомпилированная программа. Большинство непонятных мне моментов Deviaphan разъяснил. Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2011, 13:38
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru