![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
И зачем нужна такая оптимизация...
Степан © (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]ничего там не "встаёт". если компилятор может -- он так и считает "наоборот". просто маскирует этот факт -- чтобы ты не догадался.а вообще -- всё это уходит во времена седой старины. не заморачивайся. %-)