![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
статья: Написание оптимального кода под Delphi
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]
> Было бы очень неплохо, если бы статьи, перед тем как попасть
> в руки новичков просматривались профессионалами.
Согласен. Осталось найти профессионала, который готов добровольно читать статьи для новичков.