Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

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

 
Степан   (2006-10-09 20:49) [0]

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


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х лет), но на такую мелочь обратил внимание впервые. Кто-н сможет объяснить?


 
Ketmar ©   (2006-10-09 21:20) [1]

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


 
Kolan ©   (2006-10-09 21:23) [2]


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

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


 
Ketmar ©   (2006-10-09 21:25) [3]

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

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


 
Ketmar ©   (2006-10-09 21:26) [4]

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


 
Kolan ©   (2006-10-09 21:28) [5]


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

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


 
Ketmar ©   (2006-10-09 21:32) [6]

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


 
palva ©   (2006-10-09 21:47) [7]

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


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

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


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

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


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

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


 
Джо ©   (2006-10-09 22:24) [11]

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

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


 
Ketmar ©   (2006-10-09 22:27) [12]

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


 
Джо ©   (2006-10-09 22:28) [13]

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

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


 
Kolan ©   (2006-10-09 22:43) [14]

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


 
Ketmar ©   (2006-10-09 22:45) [15]

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


 
Kolan ©   (2006-10-09 22:47) [16]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
3-1157081407
tolianb
2006-09-01 07:30
2006.10.29
Экспорт из данных из DBGrid в Excel


2-1160897410
weeeeee
2006-10-15 11:30
2006.10.29
Нормализовать строку


1-1158908490
Василий Блаженный
2006-09-22 11:01
2006.10.29
TTrayIcon & baloon tips


8-1143449543
kmi
2006-03-27 12:52
2006.10.29
Сохранение TBitMap в формате JPEG


15-1160238767
wp2
2006-10-07 20:32
2006.10.29
помогите кто может.