Форум: "Начинающим";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизИ зачем нужна такая оптимизация... Найти похожие ветки
← →
Степан (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.038 c