Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

статья: Написание оптимального кода под Delphi


Страницы:   1 2

Imp ©   (2005-02-02 13:12:00) 


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

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

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

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

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


Автор этой статьи, наверное, просто не смотрел ассемблерный код, который генерирует Delphi в этом случае. Вдобавок он не знаком со стандартом Object Pascal. Дело в том, что в любом случае, аргументы, которые необходимы для цикла for do, РАСЧИТЫВАЮТСЯ ТОЛЬКО ОДИН РАЗ. Это не относится к while do или repeat until. Было бы очень неплохо, если бы статьи, перед тем как попасть в руки новичков просматривались профессионалами.


Gloomer   (2005-02-02 15:13:00) [21]

>Neznaika ©   (02.02.05 14:43) [7]
ответ на твой вопрос


procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
Memo1.Clear;
for i:=1 to 5 do Memo1.Lines.Add('');
j:=0;
for i:=0 to Memo1.Lines.Count-1 do
 begin
Memo1.Lines.Add('111');
inc(j);
 end;
ShowMessage(IntToStr(j));
end;


Poirot   (2005-02-02 14:58:00) [22]

А мона на это чудо ссылочку дать?!:))


Neznaika   (2005-02-02 14:51:00) [23]

Тогда не зря я больше люблю repeat!!!   :)


Sha   (2005-02-02 14:49:00) [24]

Neznaika ©   (02.02.05 14:43) [7]
да


MBo   (2005-02-02 14:46:00) [25]

>Neznaika ©   (02.02.05 14:43) [7]
В заглавном посте уже сказано, что по стандарту языкаfor задает количество итераций один раз.


Neznaika   (2005-02-02 14:43:00) [26]

Не хочу спорить просто интересно, (ни когда об этом не задумывался, да и вообще больше люблю repeat)!

Предположим что в цикле предложенном автором ветки, memo.lines.count=5
а в процессе цикла туда прибавляются еще строки, так что цикл новые строки будет игнорировать? ,и остановится там где ему сказали первый раз?


Sha   (2005-02-02 14:40:00) [27]

Еще ошибки:

> Здесь учитывается особенность самой операции div – округление
> в большую сторону.

> Наиболее частая ошибка – for i:=1 to length(str) do... Дело в
> том, что при каждой итерации будет вызываться функция length

Есть спорные моменты:

> b:=random(maxint); // b – заведомо не константа !
> a:=$abcd6123;
> if b>a then b:=a;
> Скомпилированный код будет выглядеть
> mov eax, $7fffffff // MaxInt
> call @RandInt
> mov ebx,eax
> mov eax, $abcd6123
> cmp eax, ebx
> jnl +$02
> А ведь значение, присвоенной переменной «а» являлось
> константой и наш пример можно было бы переписать как:
> b:=random(maxint);
> a:=$abcd6123;
> if b>$abcd6123 then b:= $abcd6123;


REA   (2005-02-02 14:39:00) [28]

Мне почему-то кажется, что функция будет вызываться чаще. И если в цикле memo1.lines.count поменяется, то результат правильный. Ассемблерный код смотрел давно. Поправьте, если это не так.


Virgo_Style   (2005-02-02 14:35:00) [29]

Вероятно, человек просто привык оптимизировать программы, "не дожидаясь милостей" от компилятора... А вы сразу ругаться :)
Imho, именно этои есть профессионализм... Хотя возможности компилятора тоже надо знать :)


Poirot   (2005-02-02 14:29:00) [30]

Ну мб он просто вспомнил си:)))


КаПиБаРа   (2005-02-02 13:40:00) [31]

Imp   (02.02.05 13:12)
Достаточно иметь возможность обсуждения статьи на том ресурсе, где статья опубликована. А уж автор прочитав комментарии исправит ошибки в своем творении. Ему же не хочется что бы на него пальцем показывали. И не надо никаких профессионалов напрягать.


TUser   (2005-02-02 13:35:00) [32]


> Было бы очень неплохо, если бы статьи, перед тем как попасть
> в руки новичков просматривались профессионалами.

Согласен. Осталось найти профессионала, который готов добровольно читать статьи для новичков.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо