Форум: "Прочее";
Текущий архив: 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.54 MB
Время: 0.041 c