Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

И зачем нужна такая оптимизация...


Степан ©   (2006-10-09 20:49:00) 

Вопрос может показаться довольно глупым, но все-таки... Допустим, есть цикл, внутри тела еоторого не используется сам счетчик цикла, например так:


var
 I: Integer;
begin
 for I := 1 to 10 do begin
   Memo1.Lines.Add(IntToStr(Random(100000)));
 end;


по идее I должно изменяться от 1 до 10... но, все происходит совсем наоборот - I изменяется от 10 до 1. Мне просто, а в чем замысел такой оптимизации? или процессору проще сравнивать I с 1, чем с 10? :))

Можно переписать для прикола код следующим образом:


var
 I: Integer;
begin
 for I := 10 downto 1 do begin
   Memo1.Lines.Add(IntToStr(Random(100000)));
 end;


На этот раз I изменятся в пределах от -10 до -1!.. Зачем? с какой целью компилятор таким образом преобразует мои слова?
Естественно, как только появляется что-н ипользующее и в качестве, например, параметра, все встает на свои места...


var
 I: Integer;
begin
 for I := 1 to 10 do begin
   Sleep(I);
   Memo1.Lines.Add(IntToStr(Random(100000)));
 end;


В Delphi я работаю сравнительно давно (около 4х лет), но на такую мелочь обратил внимание впервые. Кто-н сможет объяснить?


Степан   (2006-10-10 08:41:00) [1]

Приблизительно понятно... Спасибо...


Kolan   (2006-10-09 22:47:00) [2]

Вообщем так всяко лучьше :)


Ketmar   (2006-10-09 22:45:00) [3]

>[14] Kolan(c) 9-Oct-2006, 22:43
>Подытожу. Все дело в ассемблере :)
таки в архитектуре. %-)


Kolan   (2006-10-09 22:43:00) [4]

Подытожу. Все дело в ассемблере :)


Джо   (2006-10-09 22:28:00) [5]

> [11] Джо ©   (09.10.06 22:24)

Если loop (с джампом), то на 486 тайминг 6, тогда как dec/jne с регистрами в сумме дают — 4.


Ketmar   (2006-10-09 22:27:00) [6]

я когда-то сильно заморачивался на всём этом. ещё во времена двоек и четвёрок первых. 3д писал, однако. теперь постарел -- лениво уже. %-)


Джо   (2006-10-09 22:24:00) [7]

> [10] palva ©   (09.10.06 22:21)
> Действительно странно. Может быть, не на всех процессорах?
> Иначе зачем было придумывать loop.

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


palva   (2006-10-09 22:21:00) [8]

Действительно странно. Может быть, не на всех процессорах? Иначе зачем было придумывать loop.


Ketmar   (2006-10-09 21:59:00) [9]

>[8] palva(c) 9-Oct-2006, 21:49
>посчитайте количество команд.
не всегда уменьшение количества команд даёт выигрыш в быстродействии. сравни loop и dec/jne. второе, как ни странно, шустрее. %-)


palva   (2006-10-09 21:49:00) [10]

Вообще сумбурно изложил. Но вы сами попробуйте. Сравните пример компиляции в первом и втором случаях и посчитайте количество команд.


palva   (2006-10-09 21:47:00) [11]

Если вы писали циклы такого типа на ассемблере, то поймете: Уменьшение счетчика делается в конце цикла и сразу же делается условный переход по флагу не Z вверх на продолжение цикла. А если после вычитания ноль то проваливаемся ниже. Расположение проверки в конце цикла экономит команду передачи управления. А ноль в конце цикла делает ненужной команду сравнения.


Ketmar   (2006-10-09 21:32:00) [12]

так кто ж сказал, что я -- спать? я пилотный релиз CDM4 делаю. и ещё один проект. %-)


Kolan   (2006-10-09 21:28:00) [13]


> Ketmar ©   (09.10.06 21:26) [4]

Ну лана, тады спокойной ночи :)


Ketmar   (2006-10-09 21:26:00) [14]

зыж ужас. сколько опечаток в одном маленьком посте... было. всё-таки даже примитивный spellchecker рулит. %-)


Ketmar   (2006-10-09 21:25:00) [15]

>[2] Kolan(c) 9-Oct-2006, 21:23
>Раскажи мне тоже интересно.
во-первых, мне лениво печатать. во-вторых -- я не спал двое суток. так что смотри во-первых.

на самом деле ноги растут ещё из оптимизатора BCC и старых процессоров. сейчас это имеет смысл разве как забавный курьёз.


Kolan   (2006-10-09 21:23:00) [16]


> не заморачивайся. %-)

Раскажи мне тоже интересно.


Ketmar   (2006-10-09 21:20:00) [17]

ничего там не "встаёт". если компилятор может -- он так и считает "наоборот". просто маскирует этот факт -- чтобы ты не догадался.а вообще -- всё это уходит во времена седой старины. не заморачивайся. %-)


Наверх

Титульная страница Поиск, карта сайта Написать письмо