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

Вниз

Статья "Написание оптимального кода под 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.043 c
1-1165228805
StriderMan
2006-12-04 13:40
2007.01.28
SetFocus и ScrollBox


1-1165034574
SerB
2006-12-02 07:42
2007.01.28
Variant


2-1168759824
Garacio
2007-01-14 10:30
2007.01.28
запись в один .ini состояния MainForm и Form2


15-1167474376
IMHO
2006-12-30 13:26
2007.01.28
MS Word и кубковые сетки


3-1162584149
_Ламер_
2006-11-03 23:02
2007.01.28
IBX и юникод





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