Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Какой самый быстрый цикл?


Автор: apd2004 20.4.2009, 22:46
Хотелось бы узнать какие операторы цикла лучше выбрать для достижения максимальной скорости в Турбо Паскале 7.0 ???
Что лучше while/repeat/for ???

И ещё,какие операторы больше всего ''съедают" время????


Заранее спасибо!

Автор: mes 20.4.2009, 23:08
Цитата(apd2004 @  20.4.2009,  21:46 Найти цитируемый пост)
Хотелось бы узнать какие операторы цикла лучше выбрать для достижения максимальной скорости в Турбо Паскале 

Не на том экономите, лучше проопимизируйте алгоритм работы программы, а циклы в машинах кодах при прочих равных будут выглядить одинаково.

Автор: volvo877 20.4.2009, 23:40
Цитата(mes @  20.4.2009,  23:08 Найти цитируемый пост)
а циклы в машинах кодах при прочих равных будут выглядить одинаково.
При "прочих равных" - это как? Ничего, что на цикле Repeat/Until безо всяких "прочих равных" (скопированное тело цикла, абсолютно одни и те же вычисления, 2 раздельных запуска программы с интервалом в полчаса для тестирования разных циклов) по сравнению с For-ом имеем больше 10% выигрыша по времени (TP7.0 + WinXP)? Преимущество While - чуть меньше, но все же оно есть, он немного быстрее For-а.

Автор: mes 21.4.2009, 00:12
Цитата(volvo877 @  20.4.2009,  22:40 Найти цитируемый пост)
имеем больше 10%

может еще раз потестим ?! код Вашего теста не сохранился ?!

Автор: SneG0K 21.4.2009, 00:15
На циклах экономить? Ну это вообще извращение! Может тогда вообще писать ничего не будем? Оставим пустой проект? - Ну как же? Вообще мгновенно выполнятся будет.

Автор: volvo877 21.4.2009, 01:22
Цитата(SneG0K @  21.4.2009,  00:15 Найти цитируемый пост)
Может тогда вообще писать ничего не будем?
Угу, давайте все темы будем сводить к Мусорке, Флейму и Песочнице, да? Ибо комодератору этих разделов у себя скучно, и он решил залезть в тематику... 

Цитата(mes @  21.4.2009,  00:12 Найти цитируемый пост)
код Вашего теста не сохранился ?!
Нет, давно это было, года 3 назад, может и 4, но попробую что-нибудь сваять...

Автор: megabist 21.4.2009, 09:18
SneG0K, mes, На циклах вполне имеет смысл экономить при огромном количестве, маленьких операций.

Тестов не проводил, но вроде от препода слышал, что самый быстрый for.

Автор: SneG0K 21.4.2009, 13:40
volvo877, а логически рассудить комодеру другого раздела религия не позволяет?
Сами подумайте, каждый цикл предназначен для определенных целей. 

while будет работать пока соблюдается условие
for будет работать пока соблюдается условие, но со счетчиком

for медленней while. Но если мы начнем с while делать цикл со счетчиком то потеряем продуктивность и вернемся к for, но через while!
так разве есть смысл экономить на циклах? Все уже сэкономлено до нас!

Лучше лишние проверки и ненужные вызовы вынести за цикл. Тогда будет выгода, а так это коту под хвост.

Автор: RinOSpro 21.4.2009, 15:34
IMHO тут следует выбирать из удобства, и какой цикл подходит к данной ситуации. 

Вот что показывает отладчик:
Код

var
  i: Integer;
begin
  for i := 0 to MAXINT-1 do
  begin

  end;
end.

Код

0040339C   . B8 FFFFFF7F    MOV EAX,7FFFFFFF
004033A1   > 48             DEC EAX
004033A2   .^75 FD          JNZ SHORT Project1.004033A1

Код

var
  i: Integer;
begin
  while i < MAXINT-1 do
  begin
    Inc(i);
  end;
end.

Код

0040339C   . 3D FEFFFF7F    CMP EAX,7FFFFFFE
004033A1   . 7D 08          JGE SHORT Project2.004033AB
004033A3   > 40             INC EAX
004033A4   . 3D FEFFFF7F    CMP EAX,7FFFFFFE
004033A9   .^7C F8          JL SHORT Project1.004033A3

Код

var
  i: Integer;
begin
  repeat
    Inc(i);
  until i > MAXINT-1;
end.

Код

0040339C   > 40             INC EAX
0040339D   . 3D FEFFFF7F    CMP EAX,7FFFFFFE
004033A2   .^7E F8          JLE SHORT Project1.0040339C


Так что много не съэкономите, но если постараться smile то можно усложнить себе жизнь, гонясь за десятком тактов smile.

Автор: mes 21.4.2009, 17:34
Цитата(megabist @  21.4.2009,  08:18 Найти цитируемый пост)
На циклах вполне имеет смысл экономить при огромном количестве, маленьких операций.

Под оптимизацией_цикла подразумевается оптимизация его алгоритма, а не  оптимизация путем замены ключевого слова.

Цитата(megabist @  21.4.2009,  08:18 Найти цитируемый пост)
Тестов не проводил, но вроде от препода слышал, что самый быстрый for. 

вроде или точно ?!
кстати,
Цитата("@чья-то")

если на клетке со слоном написано "жираф" - не верь глазам своим


Цитата(SneG0K @  21.4.2009,  12:40 Найти цитируемый пост)
for медленней while. Но если мы начнем с while делать цикл со счетчиком то потеряем продуктивность и вернемся к for, но через while!
так разве есть смысл экономить на циклах? 

хочу уточнить, что
1. время изменения счетчика ничтожно мало, и заметно только на фоне пустого цикла.
Сокращение одного умножения (в цикле) принесет в десятки раз больше прибыли.
2.  Речь идет о старых компиляторах, современные оптимизируют очень хорошо, в том числе полностью исключая пустые циклы и не использованные счетчики.

Автор: SneG0K 21.4.2009, 20:16
Цитата(mes @  21.4.2009,  16:34 Найти цитируемый пост)
Сокращение одного умножения (в цикле) принесет в десятки раз больше прибыли.

А кто говорит про умножение?

Код

for i := 0 to 100 do


Идентичен 

Код

while i <= 100 do
begin
   inc(i);
end;


И смысл? Мы ничего не оптимизировали, но создается впечатление "жирафа"... И разве есть выгода в таком?


p.s. сорь, если где синтаксис неправильно объявил, давно уже с паскалем и дельфи не работаю

Автор: mes 21.4.2009, 20:34
Цитата(SneG0K @  21.4.2009,  19:16 Найти цитируемый пост)
И смысл? Мы ничего не оптимизировали, но создается впечатление "жирафа"... И разве есть выгода в таком?

жираф это когда говорят что замена цикла for на while (как в вашем посту) принесет оптимизацию и добавит 
Цитата(volvo877 @  20.4.2009,  22:40 Найти цитируемый пост)
больше 10% выигрыша по времени

а слон это когда два цикла  при прочих равных (т.е while со счетчиком  и for) выполняются одинаково. 

и соответственно осуществлять выбор между этими двумя (и еще repeat) надо в рамках логики и  удобства,
а не писать все через while из за мнимой выгоды. 
 smile 

Автор: SneG0K 21.4.2009, 20:35
mes, полностью согласенsmile Оптимизировать надо не ключевое слово цикла, а его содержимоеsmile

Автор: Rodman 21.4.2009, 20:39
ну простом пробеге по циклу пустому не увидеть..

а вот мы экспериментировали с вычислениями, так что фор все быстрее

Автор: mes 21.4.2009, 21:09
Цитата(Rodman @  21.4.2009,  19:39 Найти цитируемый пост)
а вот мы экспериментировали с вычислениями, так что фор все быстрее 


Цитата(volvo877 @  20.4.2009,  22:40 Найти цитируемый пост)
на цикле Repeat/Until ... по сравнению с For-ом имеем больше 10% выигрыша по времени (TP7.0 + WinXP)? Преимущество While - чуть меньше, но все же оно есть, он немного быстрее For-а.


кому верить  то ?!  smile  smile 

а может лучше логическому мышлению и здравому смыслу ?.. Если что взгляните на результаты в машиных кодах представленные выше.  smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)