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

Вниз

Статья "Написание оптимального кода под Delphi"   Найти похожие ветки 

 
i-am-vladko ©   (2007-01-08 14:19) [0]

Внимание! В статье имеются неточности и некорректные утверждения.  
примечание администрации

Уважаемая Администрация, слышу звон но не знаю, где он... Не могли бы Вы провести эти самые "неточности и некорректные утверждения"? Статья очень интересная, и опубликована на сайте уже давно (если не ошибаюсь, прочел ее около 1,5 - 2 месяца назад а сколько еще она лежала - даже не догадываюсь).
Может стоить ее "UpDate" ;-)


 
Dmitrij_K   (2007-01-08 14:21) [1]


> i-am-vladko ©   (08.01.07 14:19)
> Внимание! В статье имеются неточности и некорректные утверждения.


Это давно известно. Ты не первый


 
Sergey Masloff   (2007-01-08 16:06) [2]

>Ты не первый
И даже не в двадцатке. Может в FAQ занести?
Править может только автор. Автор недоступен. Так что или как есть или никак.


 
i-am-vladko ©   (2007-01-08 16:19) [3]

А почему тогда на форум не выложить все неточности и некорректные утверждения?


 
Sergey Masloff   (2007-01-08 16:21) [4]

и это уже было... сейчас наверное просто уже неинтересно


 
DevilDevil ©   (2007-01-08 16:26) [5]

> i-am-vladko ©   (08.01.07 14:19)

Небольшой недочёт:

...С точки зрения оптимизации код можно упростить еще на этапе компиляции до
b:=15616+$abcd6123;
или того проще:
b:=$ABCD9E23;


оба выражения эквивалентны по скорости

ОШИБКА:

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

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

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

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


Недочёт:

5. Не используйте конструкции типа a:=10*sin(45*pi/180); Delphi не вычислит эту константу на этапе компиляции, напротив, будет послушно вызывать sin и pi по ходу выполнения программы! В случае, если угол является переменной, по крайней мере pi можно заменить константой 3,1415...

pi - и так константа... причём точнее 3,1415


 
Anatoly Podgoretsky ©   (2007-01-08 16:29) [6]

> i-am-vladko  (08.01.2007 16:19:03)  [3]

Уже выкладывались много кратно


 
palva ©   (2007-01-08 16:34) [7]

> pi - и так константа... причём точнее 3,1415
pi не константа, pi функция без параметров. Поэтому здесь автор прав.


 
Anatoly Podgoretsky ©   (2007-01-08 16:36) [8]

> palva  (08.01.2007 16:34:07)  [7]

Еще неизвестно что будет затратнее функция, которая берет константу из процессора и возвращает ее на стеке или переменная/константа


 
Юрий Зотов ©   (2007-01-08 16:46) [9]

> palva ©   (08.01.07 16:34) [7]

const
 A = Pi/2;

Компилируется, собака...
:o)


 
X9 ©   (2007-01-08 16:52) [10]

> [9] Юрий Зотов ©   (08.01.07 16:46)
> const
> A = Pi/2;
>
> Компилируется, собака...
> :o)

Насколько я знаю, Delphi допускает использование некоторых функций из модуля System при объявлении констант (например: Length, High, Low etc.)


 
ProgRAMmer Dimonych ©   (2007-01-08 17:05) [11]

> ОШИБКА:
>
> Вынесение инвариантного кода за пределы цикла – не выносится.
>  Наиболее распространенный недочет – условие цикла записывается
> как:
>
> for i:=0 to memo1.lines.count – 1 do...
>
>  Delphi будет при каждой итерации вызывать метод count,
> вычитать из результата 1 и потом уже сверять. Настоятельно
> рекомендуется переписывать подобный код как
>
> lin := .lines.count – 1;
> for i:=0 to lin do...
Если это правда, то моё мнение о Delphi резко покатилось вниз, т.к. даже QBasic в своё время вычислял параметры для цикла for один раз.


 
Sha ©   (2007-01-08 17:05) [12]

Это обман, не волнуйся


 
Чапаев ©   (2007-01-08 17:07) [13]

> [11] ProgRAMmer Dimonych ©   (08.01.07 17:05)
Это не правда, инвариант цикла с параметром вычисляется один раз до выполнения цикла.


 
Юрий Зотов ©   (2007-01-08 17:09) [14]

> X9 ©   (08.01.07 16:52) [10]

Совершенно верно. Еще точнее, это функции даже не из модуля System, а встроенные в сам компилятор (хотя формально в модуле System они могут и присутствовать).

> ProgRAMmer Dimonych ©   (08.01.07 17:05) [11]

Мы можем быть спокойны - это неправда.
:о)


 
Юрий Зотов ©   (2007-01-08 17:11) [15]

> X9 ©   (08.01.07 16:52) [10]

Имелось в виду, что значения таких функций вычисляются именно на этапе компиляции, а в код попадают уже готовые константы.


 
DevilDevil ©   (2007-01-08 18:41) [16]


> Насколько я знаю, Delphi допускает использование некоторых
> функций из модуля System при объявлении констант (например:
>  Length, High, Low etc.)


Насколько я знаю, High(), Low(), sizeof() - Это константы


 
Чапаев ©   (2007-01-08 18:42) [17]

> [16] DevilDevil ©   (08.01.07 18:41)
Не всегда


 
Чапаев ©   (2007-01-08 18:43) [18]

то есть они в любом случае не константы, но в некоторых случаях их нельзя вычислить на этапе компиляции.


 
AlexanderMS ©   (2007-01-08 18:54) [19]


> ...инвариант цикла с параметром вычисляется один раз до
> выполнения цикла.


for I := 0 to Memo1.Lines.Count - 1 do
 Memo1.Lines.Delete(I);


Не все строки удаляются, но и ошибки нет! Ведь Memo1.Lines.Count будет меняться с каждой итерацией? А если мы поудаляем строчки, то теоретически получим List index out of bounds, а на практике - всё тихо!

Так это - правда, или в деятельности компилятора, как и в действиях всякого существа, пусть и неживого, присутствуют элементы проявления элементарного человеческого интеллекта?


 
Sha ©   (2007-01-08 19:05) [20]

Для меня всегда оставалось загадкой, что хотели этим изобразить

for I := 0 to Memo1.Lines.Count - 1 do
Memo1.Lines.Delete(I);


 
Чапаев ©   (2007-01-08 19:07) [21]

> [19] AlexanderMS ©   (08.01.07 18:54)
Ерунду говоришь. Вызови Memo1.Lines.Delete(100); в мемо с 4 строками (как сделал я) и тоже ошибки не получишь.

Не путай "умения" листа и стринглиста.


 
ferr ©   (2007-01-08 19:10) [22]

> [17] Чапаев ©   (08.01.07 18:42)

sizeOf точно на этапе компиляции известно.


 
DevilDevil ©   (2007-01-08 19:40) [23]


> Чапаев ©   (08.01.07 18:43) [18]
> Не всегда
> то есть они в любом случае не константы, но в некоторых
> случаях их нельзя вычислить на этапе компиляции.


Почему то не компилируется:

 function Min(X, Y : Integer) : integer;
 begin
   if X <= Y then Result := X else Result := Y;
 end;

 const MyConst = Min(5, 6);


Вроде константа:

type MyType = array[0..50] of byte;

procedure TForm1.FormCreate(Sender: TObject);
var
 S : integer;
begin
 // mov esi, $00000164
 S := High(MyType) + Low(MyType) + High(byte) + Low(byte) + sizeof(MyType);
 Caption := IntToStr(S);
end;


Единственный известный мне пример, когда High() - "функция" (не константа):
S := High(Array of ...);

Сдаётся мне и ord(), и chr() - тоже не функции, лень проверять...
Кстати говоря, Inc(), Dec(), Succ(), Pred() --- тоже не являются функциями как таковыми.


 
Kerk ©   (2007-01-08 19:41) [24]

Не проще эту статью с сайта удалить?


 
isasa ©   (2007-01-08 19:48) [25]

DevilDevil ©   (08.01.07 18:41) [16]

Насколько я знаю, High(), Low(), sizeof() - Это константы


Это как?

var dynArr: array of integer;
...
SetLength(dynArr, 1);
i:=High(dynArr);  // i = 0
SetLength(dynArr, 0);
i:=High(dynArr);  // i = -1


 
DevilDevil ©   (2007-01-08 20:00) [26]


> Kerk ©   (08.01.07 19:41) [24]
> Не проще эту статью с сайта удалить?


Нет, мне кажется, в статье много нужного. Другое дело дополнить и исправить ошибки.

> isasa ©   (08.01.07 19:48) [25]
исключение, см [23]


 
isasa ©   (2007-01-08 20:19) [27]

DevilDevil ©   (08.01.07 20:00) [26]
исключение, см [23]


оптимизация ?


 
ors_archangel ©   (2007-01-08 20:53) [28]

> Насколько я знаю, High(), Low(), sizeof() - Это константы

- это операторы


 
vidiv ©   (2007-01-08 23:25) [29]


> ors_archangel ©   (08.01.07 20:53) [28]
> > Насколько я знаю, High(), Low(), sizeof() - Это константы
>
> - это операторы

очень остроумно =)
это всего лишь функции, написанно в хелпе =)
а на каком этапе подсчитывается их значение, это уже другой вопрос =)


 
ors_archangel ©   (2007-01-08 23:30) [30]

compiler magic :)


 
KSergey ©   (2007-01-09 14:56) [31]

> ProgRAMmer Dimonych ©   (08.01.07 17:05) [11]
> > вычитать из результата 1 и потом уже сверять. Настоятельно
>
> > рекомендуется переписывать подобный код как
> >
> > lin := .lines.count – 1;
> > for i:=0 to lin do...
> Если это правда, то моё мнение о Delphi резко покатилось
> вниз, т.к. даже QBasic в своё время вычислял параметры для
> цикла for один раз.

Прикинь, С++ до сих пор вычисляет каждый раз. Ацтой ваще, правда?


 
Kirr.   (2007-01-09 18:28) [32]


> sizeOf точно на этапе компиляции известно.


Delphi под рукой нет, но:


var
 p:pointer;
begin
 GetMem(p,255);
 sizeof(p^);
end;


 Что должно вернуть sizeof на этапе компиляции? В С++ подобная конструкция будет вычесленна в ран-тайм.


 
Kirr.   (2007-01-09 18:35) [33]


> Прикинь, С++ до сих пор вычисляет каждый раз. Ацтой ваще,
>  правда?


 Очень сильно сомневаюсь, чтобы в стандарте языка указывалось бы на то, что функцию в выражении условия в цикле for нужно вычислять на каждой итерации. А нормальный компилятор это вполне с оптимизирует. Если, конечно, оптимизация включенна.


 
Думкин ©   (2007-01-10 06:10) [34]

> Kirr.   (09.01.07 18:35) [33]

Да вам батенька в ушедшую далеко ветку про For в исполнении Паскаля и Си.



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

Текущий архив: 2007.01.28;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.047 c
3-1162905727
FB
2006-11-07 16:22
2007.01.28
Получить длину строки в FireBird


2-1168162502
enZinger
2007-01-07 12:35
2007.01.28
edit.keypress


15-1167984292
DeadMeat
2007-01-05 11:04
2007.01.28
"Родные" *.ЕХЕ от Висты не работают в ХР


2-1168427926
Mishenka
2007-01-10 14:18
2007.01.28
Чем отличаются события формы OnClose и OnCloseQuery ?


9-1142625053
KiberKot
2006-03-17 22:50
2007.01.28
2Д редактор