![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Каждая процедурка для каждого типа или "монстр" для всех? [D7, WinXP]
HydraMarat © (2004-12-01 18:52:00)Здравствуйте, Мастера! Опять вот задумался об оптимизации...
{ вариант №1 }
procedure ForAll(V: Extended);
begin
V := -V;
end;
{ вариант №2 }
procedure NegSingle(V: Single);
begin
V := -V;
end;
procedure NegCurrency(V: Currency);
begin
V := -V;
end;
procedure NegExtended(V: Extended);
begin
V := -V;
end;
{ Вопрос }
Выиграю ли я в скорости, если буду для каждого типа использовать специализированные процедуры (вариант 2) или же особо ничего не изменится, если я переменные разных типов "пропущу" через ForAll (вариант 1)? И можно ли под эти же операции "подписать" TDateTime (в смысле считать его простым дробным числом и править через ForAll).
Спасибо!
Anatoly Podgoretsky (2004-12-02 09:28:00) [1]HydraMarat (01.12.04 18:52)
Наилучший вариант, выкинуть эти процедуры, поскольку в них нет смысла, вызов этих процедур пустая трата времени, поскольку ничего не происходит. Но даже если бы что ни будь и происходило, то смотри сообщение MBo © (02.12.04 08:27) [7], самое начало.
MBo (2004-12-02 08:27:00) [2]для такой простой процедуры больше времени будет тратиться на сам ее вызов и возврат. Если ты на самом деле просто меняешь знак - не используй процедур/функций, а просто в коде пиши F:=-F;
Есть еще быстрый способ, основанный на знании внутреннего представления вещественных типов (идея А.Петрова)
var
f: Double;//или Single,Extended
begin
f := -2.5;
PByteArray(@f)[SizeOf(f) - 1] := PByteArray(@f)[SizeOf(f) - 1] xor $80;
caption := FloatToStr(f);
устрашающая конструкция компилируется всего в пару команд lea, xor, сопроцессор не задействуется, стек (что происходит при вызове процедур) тоже не используется.
begin...end (2004-12-01 19:25:00) [3]> [4] HydraMarat (01.12.04 19:13)
> Вот об этом хотелось бы поподробнее! Так ли это?
"...Чтобы обеспечить в своих системах поддержку сопроцессорных типов, Borland вводит в Turbo Pascal типы Single, Double и Extended. Extended – это родной для сопроцессора тип, а типы Single и Double получаются из него очень простым усечением. При загрузке числа типа Single или Double во внутренний регистр сопроцессора последний конвертирует их в Extended. Напротив, при выгрузке чисел этих типов из регистра в память сопроцессор усекает их до нужного размера. Внутренние же операции всегда выполняются с данными типа Extended (впрочем, из этого правила есть исключение, на котором мы остановимся позже, после детального рассмотрения формата различных типов). Single и Double используются для экономии памяти..."
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374
HydraMarat (2004-12-01 19:13:00) [4]А ну да, про var забыл, но это я так... второпях. Хотел добавить, что эти процедурки естественно не одноразовые, можно сказать, что на них "все живет"! Типа как инструкции у проца... Так что вызываются чрезвычайно часто. Меняет ли это дело?
> Всё равно переменные типа Single, Real и т.д. перед обработкой
> в Extended преобразуются, насколько я знаю
Вот об этом хотелось бы поподробнее! Так ли это?
Спасибо!
XProger (2004-12-01 19:13:00) [5]
var
i, t : DWORD;
...
t := GetTickCount;
for i := 1 to 1000000000 do
ForAll(10);
ShowMessage(IntToStr(GetTickCount - t));
Попробуй так для всех...
P.S.
Я как-то задавался этим вопросом, после экспериментов выяснилось что размер переменной не должен превышать 32 бита(тогда скорость работы стабильная). После превышения (допустим, работа с double) скорость резко падает :)
VMcL (2004-12-01 19:12:00) [6]>> HydraMarat (01.12.04 18:52)
особо ничего не изменится, если я переменные разных типов "пропущу" через ForAll (вариант 1)
Вот это.
> можно ли под эти же операции "подписать" TDateTime
Можно. Для этого привести его к Double.
begin...end (2004-12-01 19:06:00) [7]> HydraMarat (01.12.04 18:52)
> Выиграю ли я в скорости, если буду для каждого типа использовать
> специализированные процедуры (вариант 2) или же особо ничего
> не изменится, если я переменные разных типов "пропущу" через
> ForAll (вариант 1)?
Не уверен, но думаю, что ничего особо не изменится. Даже, может быть, лучше вариант 1. Всё равно переменные типа Single, Real и т.д. перед обработкой в Extended преобразуются, насколько я знаю. Только Вы, похоже, про varзабыли.
> И можно ли под эти же операции "подписать" TDateTime (в
> смысле считать его простым дробным числом и править через
> ForAll).
Можно.
jack128 (2004-12-01 19:05:00) [8]лудше общий вариант. AFAIK проц именно так и считает, а потоом обрезает результат до нужной точности.
> )? И можно ли под эти же операции "подписать"
> TDateTime
можно, только вот смысла нет.