Текущий архив: 2004.12.19;
Скачать: CL | DM;
Вниз
Каждая процедурка для каждого типа или "монстр" для всех? Найти похожие ветки
← →
HydraMarat (2004-12-01 18:52) [0]Здравствуйте, Мастера! Опять вот задумался об оптимизации...
{ вариант №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).
Спасибо!
← →
jack128 © (2004-12-01 19:05) [1]лудше общий вариант. AFAIK проц именно так и считает, а потоом обрезает результат до нужной точности.
> )? И можно ли под эти же операции "подписать"
> TDateTime
можно, только вот смысла нет.
← →
begin...end © (2004-12-01 19:06) [2]> HydraMarat (01.12.04 18:52)
> Выиграю ли я в скорости, если буду для каждого типа использовать
> специализированные процедуры (вариант 2) или же особо ничего
> не изменится, если я переменные разных типов "пропущу" через
> ForAll (вариант 1)?
Не уверен, но думаю, что ничего особо не изменится. Даже, может быть, лучше вариант 1. Всё равно переменные типа Single, Real и т.д. перед обработкой в Extended преобразуются, насколько я знаю. Только Вы, похоже, про var забыли.
> И можно ли под эти же операции "подписать" TDateTime (в
> смысле считать его простым дробным числом и править через
> ForAll).
Можно.
← →
VMcL © (2004-12-01 19:12) [3]>>HydraMarat (01.12.04 18:52)
особо ничего не изменится, если я переменные разных типов "пропущу" через ForAll (вариант 1)
Вот это.
>можно ли под эти же операции "подписать" TDateTime
Можно. Для этого привести его к Double.
← →
HydraMarat (2004-12-01 19:13) [4]А ну да, про var забыл, но это я так... второпях. Хотел добавить, что эти процедурки естественно не одноразовые, можно сказать, что на них "все живет"! Типа как инструкции у проца... Так что вызываются чрезвычайно часто. Меняет ли это дело?
> Всё равно переменные типа Single, Real и т.д. перед обработкой
> в Extended преобразуются, насколько я знаю
Вот об этом хотелось бы поподробнее! Так ли это?
Спасибо!
← →
XProger © (2004-12-01 19:13) [5]
var
i, t : DWORD;
...
t := GetTickCount;
for i := 1 to 1000000000 do
ForAll(10);
ShowMessage(IntToStr(GetTickCount - t));
Попробуй так для всех...
P.S.
Я как-то задавался этим вопросом, после экспериментов выяснилось что размер переменной не должен превышать 32 бита(тогда скорость работы стабильная). После превышения (допустим, работа с double) скорость резко падает :)
← →
begin...end © (2004-12-01 19:25) [6]> [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
← →
MBo © (2004-12-02 08:27) [7]для такой простой процедуры больше времени будет тратиться на сам ее вызов и возврат. Если ты на самом деле просто меняешь знак - не используй процедур/функций, а просто в коде пиши 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, сопроцессор не задействуется, стек (что происходит при вызове процедур) тоже не используется.
← →
Anatoly Podgoretsky © (2004-12-02 09:28) [8]HydraMarat (01.12.04 18:52)
Наилучший вариант, выкинуть эти процедуры, поскольку в них нет смысла, вызов этих процедур пустая трата времени, поскольку ничего не происходит. Но даже если бы что ни будь и происходило, то смотри сообщение MBo © (02.12.04 08:27) [7], самое начало.
Страницы: 1 вся ветка
Текущий архив: 2004.12.19;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.076 c