IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> производительность разных типов циклов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской
Реальное имя: Данил

Репутация: -  0  +


Кто может обьяснить, почему производительность совершенно одинаковых программ, но использующих разные типы циклов, различается(while - самый "тугодумный", For & repeat побыстрее)?????? wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской

Репутация: -  3  +


Честно полностью ответ на этот вопрос я не знаю, но могу предположить.

Цикл for ярко выраженный цикл со счетчиком. В ассемблере он будет реализовываться как явный цикл со счетчиком, т. е.

@cicl
mov cx, 100 ; загрузим в счетчик 100 итераций цикла
;
; далее тело твоего цикла
;
loop @cicl


Соответственно после каждого шага переменная cx будет уменьшаться на 1 (и перемещаться на метку @cicl). Это в машинных кодах сделать довольно просто, поэтому и работает быстро.

While и Repeat устроены уже немного по другому, в их основе лежит операция сравнения и переход по меткам. Соответственно программе уже необходимо сравнить что-то и уже потом перейти к нужному телу. Отсюда и скорость выполнения будет поменьше (большее число операций, и соответственно большее время на выполнение).


Все это, лишь мое предположение. Буду рад если меня кто-то поправит.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Loop для циклов паскаль не использует, делает просто cmp / jne. Для while и repeat делается практически тоже самое, по-этому скорость должна быть примерно равной. Но на скорость будут влиять такие факторы как тип переменной в условии цикла (для integer будет просто inc i, а для longint-a add [i],1; adc [i+2],0) ну и сложность самого условия (для while и repeat). Плюс не маловажно каким образом изменяется переменная внутри циклов while и repeat, т.к. скорость выполнения inc (i) и I:=i+1 разная.. Это уже как то разбиралось на форуме подробнее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Улучшение кода


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской
Реальное имя: Данил

Репутация: -  0  +


Malice^Плюс не маловажно каким образом изменяется переменная внутри циклов while и repeat, т.к. скорость выполнения inc (i) и I:=i+1 разная.. ^

кстати да.... первоначально писал прогу, в которой счетчик цикла (в repeat & while) увеличивается присваиванием(I:=I+1). заменил присваивание на макрос inc(i)... теперь while & repeat исполняются намного быстрее фора!!!! dry.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(daZe1 @ 4.12.2007 18:00) *

Malice^Плюс не маловажно каким образом изменяется переменная внутри циклов while и repeat, т.к. скорость выполнения inc (i) и I:=i+1 разная.. ^

кстати да.... первоначально писал прогу, в которой счетчик цикла (в repeat & while) увеличивается присваиванием(I:=I+1). заменил присваивание на макрос inc(i)... теперь while & repeat исполняются намного быстрее фора!!!! dry.gif

Ну.. Я ж зря не совру smile.gif Теперь попробуй поэкспериментируй с типом переменной i при вариантах + и inc и типах integer и longint.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской
Реальное имя: Данил

Репутация: -  0  +


ок!!! спасибо большое за ответ)) smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Оптимизировать сам цикл имеет смысл только в случае очень короткого тела цикла. В этом случае бывает целесообразно применение т.н. развернутых циклов. Т.е., например, длина цикла уменьшается в 8-10 раз, а нужная последовательность операций (обычно одна строка) повторяется в теле цикла те же 8-10 раз.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 18
Пол: Мужской
Реальное имя: Данил

Репутация: -  0  +


да, я слышал про развернутые циклы, но дело в том, что меня интрересует соотношение между производительностью именно различных типов циклов. и я так понял,что по каким то причинам (возможно связано с выполнением на машинном уровне) самый быстрый - вайл
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Я так понимаю, что вопрос производительности интересует не абстрактно, а с точки зрения вполне конкретных нужд. Теоретического интереса, очевидно, данный вопрос не представляет.
В подавляющем большинстве случаев производительность цикла определяется содержимым его тела и лишь в очень немногих случаях вклад в производительность вносит сам цикл.
Именно конкретные рекомендации для этого случая я и привел.
По поводу того, какой из циклов самый быстрый, достоверной информации не существует и существовать не может, т.к. конкретный результат будет зависеть от используемого компилятора, используемого процессора, а также того, что находится внутри цикла.

Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(andriano @ 12.12.2007 22:21) *
Оптимизировать сам цикл имеет смысл только в случае очень короткого тела цикла. В этом случае бывает целесообразно применение т.н. развернутых циклов.
Но нужно учитывать тот факт, что размер тела цикла должен уместиться в кеш-линейку процессора - это даст максимальное ускорение выполнения.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(hardcase @ 19.12.2007 2:05) *

Но нужно учитывать тот факт, что размер тела цикла должен уместиться в кеш-линейку процессора - это даст максимальное ускорение выполнения.

Ну, во-первых, не обязательно в единственную, а во вторых - могу повторить еще раз: циклы с длинным телом разворачивать неэффективно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 16:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name