Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.038 c
3-1100687772
Chery
2004-11-17 13:36
2004.12.19
Нет конекта через службу Borland Socket Server.


3-1100762606
Term
2004-11-18 10:23
2004.12.19
Автоинкремент своими руками


1-1102093930
Sur
2004-12-03 20:12
2004.12.19
Разве нельзя читать самаво себя?


1-1101912967
Elast
2004-12-01 17:56
2004.12.19
Поиск в TList


14-1101444567
КаПиБаРа
2004-11-26 07:49
2004.12.19
Life is kaif