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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
14-1109400871
Knight
2005-02-26 09:54
2005.03.20
Что может быть приятнее того, когда лицензионная прога...


1-1109783865
msgipss
2005-03-02 20:17
2005.03.20
Помогите создать иерархию, динамической вложенности


14-1109748040
Павел
2005-03-02 10:20
2005.03.20
SATA RAID 0 Нужен ли он?


1-1110045541
Leeechhhh
2005-03-05 20:59
2005.03.20
Как сделать дрэг/дроп


3-1108841691
Bogdan
2005-02-19 22:34
2005.03.20
Отсортировать по дате