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

Вниз

Каждая процедурка для каждого типа или "монстр" для всех?   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.034 c
4-1096221396
ser_ega
2004-09-26 21:56
2004.12.19
Распознавание со сканера!


11-1084142128
Диман
2004-05-10 02:35
2004.12.19
Картинки в ListView


4-1098538256
RedLord
2004-10-23 17:30
2004.12.19
блокировка перезапуска компа


14-1101669213
iZEN
2004-11-28 22:13
2004.12.19
Сравнение языков по-новому.


1-1102411586
Arkady
2004-12-07 12:26
2004.12.19
Hint без наведения





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