1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
|
|||||||||||
1 | |||||||||||
Целесообразность использования цикла.18.10.2011, 01:43. Показов 2502. Ответов 22
Метки нет (Все метки)
Этот момент в универе нам не объясняли. Хочу сразу сказать, я знаю зачем, как и когда используются циклы. Собственно возник не большой спор. Какое преимущество будет иметь код
0
|
18.10.2011, 01:43 | |
Ответы с готовыми решениями:
22
Отсортированные по порядку случайно выбранные номера (целесообразность использования random_shuffle в задании) Шейкерная сортировка без использования while цикла Обнуление динамического массива без использования цикла Вывод массива без использования цикла на C(pure)) |
33 / 27 / 2
Регистрация: 08.09.2010
Сообщений: 402
|
|
18.10.2011, 03:59 | 2 |
1) сокращается текст программы
2) в больших программах i может быть больше чем 10, к примеру 100, и тогда будет уже затруднительно писать 100 раз одно и тоже (просто надоест)
0
|
1 / 1 / 0
Регистрация: 30.06.2010
Сообщений: 19
|
||||||
18.10.2011, 04:19 | 3 | |||||
Цикл можно расписать как
0
|
Заблокирован
|
|
18.10.2011, 08:30 | 4 |
ZaxarPal, однозначно, что первый вариант даёт бонус на этапе написания исходного кода.
А дальше нужно смотреть во что скомпилируются оба варианта. Вполне возможно, что первый вариант после компиляции примет такой же вид, как и второй. Тогда можно будит сказать, что второй вариант не даёт никаких бонусов.
0
|
1 / 1 / 0
Регистрация: 18.01.2011
Сообщений: 83
|
|
18.10.2011, 08:59 [ТС] | 5 |
Вопрос в том, будет ли преимущество по использованию ресурсов системы программой с циклом перед программой без. Т.е. меньше операций процессора, меньше использования оперативки и т.д.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
18.10.2011, 10:51 | 7 |
Оптимизирующие компиляторы умеют разворачивать даже "длинные" циклы. В данном случае важно, какие операции выполняются в блоке <действие>. Т.е. если там очень сложные вычисления, то экономия одного if на итерацию ничего не даст. Если же сложность действия сопоставима со сложностью условия, то компилятор может принять решение о необходимости развернуть цикл.
В большинстве случаев лапша быстрее цикла. Во многих случаях это преимущество несущественно.
1
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
18.10.2011, 10:59 | 8 |
1. Цикл компактнее в исходинке. А что компактнее в исходнике, то быстрее пишется и читается.
2. Цикл компактнее в коде. А что компактнее в коде, то может быстрее исполняться. 3. В цикле можно быстро поменять число повторов, в том числе, с клавиатуры, или по результатам других операций. Но циклы не всегда целесообразны. Иногда приходится вручную повторять текст тела цикла вместо написания самого цикла и именно ради быстрого исполнения.
0
|
Deviaphan
|
18.10.2011, 11:07
#9
|
1
|
18.10.2011, 11:10 | 10 |
ZaxarPal, смотря для чего это вам. Например, при программной реализации симметричных шифров стараются избегать циклы раундовых преобразований. Вместо for(...) a[i] так и пишут a[0], a[1]... Снимется зависимость от оптимизации компилятора и код работает быстрее.
0
|
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
|
|
18.10.2011, 11:17 | 11 |
Уверенности нет. Ключевое слово может.
Приходилось заменять цикл строками для экономии времени исполнения.
0
|
Higher
|
||||||
18.10.2011, 11:39 | 12 | |||||
А что же это такое вы пишете, что циклы вас по времени не устраивают?
Насколько я знаю, циклы реализовываются примерно так:
Приведите пример, при котором будет хоть как-то чувствоваться улучшение быстродействия, если цикл заменить на последовательность действий. Может, такой и существует, самому интересно. И это уже не говоря о том, что далеко не всегда можно заменить цикл(рекурсия не в счет, она еще менее эффективна).
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
18.10.2011, 11:51 | 14 |
Тут суть не в уменьшении на один иф с каждой итерации, а в том, что устраняется ветвление, то есть предиктор на 100% не ошибается, не требуется очистка и перезаполнение конвеера и т.д. Кроме того, если итерации не зависимы между собой, то благодаря всё тому же конвееру, операции могут выполняться "одновременно".
Если в цикле сложное условие, то предиктор может часто ошибаться и производительность никакущая будет. Последовательный код всегда быстрее кода с ветвлениями, без вариантов. Рекурсивные функции могут "инлайница" образуя последовательный код, более эффективный, чем цикл. Ну и разговоры о взаимозаменяемости циклов и рекурсии это просто теоретическое балаболство.)
1
|
Higher
|
|
18.10.2011, 12:04 | 15 |
Для каких-нибудь алгоритмов да, но здесь же речь идет о элементарном цикле, а один jmp явно эффективнее вызова функции будет.
Я видимо чего-то не понимаю, но, насколько я понял, речь шла о элементарном цикле, который выполняет n(причем n - const) действий. Не могу представить другой задачи, в которой цикл можно заменить на последовательность действий.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
18.10.2011, 12:17 | 16 |
Я вот не вижу ничего элементарного в записи <действие> .)
Выполняется 10 итераций с выполнением неизвестного объёма кода. Так что тут вообще говорить не о чем, только пространные предположения.) Допустим, речь о инициализации массива из 10 элементов. цикл удобнее, но последовательное присваивание эффективнее. В относительных величинах - намного эффективнее. В абсолютных - несколько тактов процессора. Добавлено через 2 минуты Любой цикл с известным количеством итераций (известными до запуска цикла) можно развернуть.
1
|
Higher
|
||||||
18.10.2011, 12:34 | 17 | |||||
Здесь удобнее плоский стиль(видел такой термин где-то ) будет =)
Чем? Вы же сами сказали Компилятор должен развернуть такой цикл, и в бинарном коде особой разницы быть не должно.
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
18.10.2011, 12:39 | 18 |
Я как-то упустил из виду это утверждение.) Тогда да, никакой. Но только нужен хороший оптимизирующий компилятор.)
Добавлено через 1 минуту С другой стороны, пока не залезешь в ассемблерный листинг не поймёшь, развернул он цикл или нет. С ещё более другой стороны, если он цикл не развернул, то, вероятно, такой потребности не возникло.)
1
|
Заблокирован
|
|
18.10.2011, 12:46 | 19 |
Речь не о работе скомпилированного кода. Речь об оптимизации исходного кода самим человеком.
Если от "разворачивания" цикла будит ощутимый профит, неужели компилятор сам не догадается это сделать? Одно дело оптимизировать принцип хранения данных (дата-ориентированное программирование) Другое дело оптимизировать алгоритмы в узких местах. И третье - пытаться ручками оптимизировать исходный код. Можно сделать так: 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 [ТС] | 20 |
Вопрос был больше таки в том, как будет работать скомпилированная программа. Большинство непонятных мне моментов Deviaphan разъяснил. Спасибо.
0
|
18.10.2011, 13:38 | |
18.10.2011, 13:38 | |
Помогаю со студенческими работами здесь
20
Как обойти массив без использования цикла Ознакомиться с операторами цикла их видами и правилами их использования Опишите сходство и различие использования операторов цикла for, while Составить циклические программы без использования операторов цикла Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |