Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

Вынесение инвариантного кода за пределы цикла   Найти похожие ветки 

 
MU ©   (2005-03-06 13:08) [0]

В статье на этом сайте http://www.delphimaster.ru/articles/optimization.html
прочитал следущее:


Вынесение инвариантного кода за пределы цикла – не выносится. Наиболее распространенный недочет – условие цикла записывается как:

for i:=0 to memo1.lines.count – 1 do...

 Delphi будет при каждой итерации вызывать метод count, вычитать из результата 1 и потом уже сверять. Настоятельно рекомендуется переписывать подобный код как

lin := .lines.count – 1;
for i:=0 to lin do...

 Весь код VCL написан с нарушением этого правила. Очевидно, что проще подобного рода оптимизацию встроить в компилятор, нежели переписывать VCL :)


Честно говоря, удивился.
Так ли это?


 
GuAV ©   (2005-03-06 13:11) [1]

нет.
выражения заданные как границы в цикле for считаются только один раз.

пример
I := 0;
for I := 1 to I + 5 do
 WriteLn(I);

только 5 итераций.


 
MU ©   (2005-03-06 13:13) [2]

Я тоже так всегда думал...
Зачем тогда помещать такую "статью"?
Или это уже в "Потрепаться"?


 
Anatoly Podgoretsky ©   (2005-03-06 13:55) [3]

Да муру автор написал, не удосужился даже посмотреть справку по FOR, которая гласит, для I от Start до End, выполнить N раз


 
Petr V. Abramov ©   (2005-03-06 16:03) [4]

особенно умиляет "подставляйте в код непосредственные значения" :)


 
Дмитрий Мыльников   (2005-03-06 21:55) [5]

начиная с D4 (если правильно помню) она умеет оптимизировать циклы fоr так, чтобы значения границ вычислялись только один раз. В качестве примера можете попробовать выполнить тест
for I := 0 to List.Count - 1 do
 List.Delete(I);
если количество элементов больше нуля, то он упадёт.

Кстати, с этого же момента в качестве счётчика цикла можно использовать только локальные переменные, которые при этом компилятор помещает во время цикла в регистр, а не на стек. Если же попытаться использовать статическую переменную, то компилятор выдаст ошибку.

Хотя, я до сих пор по привычке ещё со времён паскаля пишу
var i, ei: integer;
...
 ei := List.Count - 1;
 for i := 0 to ei do
...
хотя, во времена паскаля цикл for работал медленее while, и я в основном старался использовать его, а сейчас, из-за использования регистровой переменной для счётчика, стало наоборот.


 
GuAV ©   (2005-03-06 22:13) [6]

Дмитрий Мыльников   (06.03.05 21:55) [5]
начиная с D4 (если правильно помню)

Видимо неправильно ибо пример в [1] работает и в Borland Pascal 7.0


> хотя, во времена паскаля цикл for работал медленее
> while, и я в основном старался использовать его, а
> сейчас, из-за использования регистровой переменной для
> счётчика, стало наоборот.


for тоже может считать стековой (а while - регистровой). Тем не менее for обычно лучше оптимизируется.


 
Юрий Зотов ©   (2005-03-06 22:25) [7]

Еще один перл оттуда же (тоже по поводу цикла for):

"Замена инкремента на декремент – не производится. Более того, даже декрементный цикл компилируется в неоптимальный код, т.к. не используется флаг ZF. Вместо этого происходит сравнивание значения регистра с 0".

Судя по тексту статьи, автор неоднократно заглядывал в окно CPU, поэтому не увидеть замену инкремента на декремент он никак не мог. Тем не менее, не увидел. Почему?

Напрашивается такой ответ - исследование оптимизирующих свойств компилятора Delphi проводилось... при отключенной оптимизации.


 
MU ©   (2005-03-06 22:33) [8]

Юрий Зотов ©   (06.03.05 22:25) [7]
>> проводилось... при отключенной оптимизации.
 :))
Может, в Орешник ее, статью-то


 
Palladin ©   (2005-03-06 22:36) [9]

нет, в оршник нельзя, на самом деле, неисповедимы пути оптимизации


 
SergP ©   (2005-03-06 23:02) [10]


>  [3] Anatoly Podgoretsky ©   (06.03.05 13:55)
> Да муру автор написал, ...


А разве премодерации нет?


 
GuAV ©   (2005-03-06 23:39) [11]


> на самом деле, неисповедимы пути оптимизации

воистину. однако тогда нефиг пытаться исповедовать их. а [0] - эт уже не оптимизация а язык.



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

Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.043 c
14-1109612601
}|{yk
2005-02-28 20:43
2005.03.20
По поводу Евровидения-2005


11-1091075128
Baloo
2004-07-29 08:25
2005.03.20
ув. В. Кладов! В элемент типа TEdit вставить понятно как, а в мно


6-1098015635
vers
2004-10-17 16:20
2005.03.20
простейший чат на idTCPServer/idTCPClient


3-1108641732
Shizuku
2005-02-17 15:02
2005.03.20
Report for iBx


1-1109948600
вопрос
2005-03-04 18:03
2005.03.20
Надо из компонента узнать, что в форме выполнилось событие





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский