Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.49 MB
Время: 0.037 c
6-1149575747
Vavilon
2006-06-06 10:35
2006.10.29
Написание плагина для Internet Explorera


2-1160744545
Gloomer
2006-10-13 17:02
2006.10.29
Как получить значения ключей ветки реестра?


3-1157362217
alexvan
2006-09-04 13:30
2006.10.29
Вопрос по BLOB


15-1160071125
Иксик
2006-10-05 21:58
2006.10.29
Справочники имен


4-1149756872
Eldev
2006-06-08 12:54
2006.10.29
Смена буквы раздела диска





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский