IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Почему Trunc так медлителен?, Проверил в turbo pascal и Delphi7.
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Итак у нас, например, такая задача. Вещественное число из диапазона от 0 до 65535 преобразовать в word взятием целой части.

Это программа для дельфы.


program TruncTest;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows;

var
i: longint;
d, d1: double;
d_w: array [0 .. 3] of word absolute d;
k: word;
T: longint;

begin
d := 1234.5678;

T := GetTickCount;
for i := 0 to $FFFFFF do
k := trunc(d);
T := GetTickCount - T;
WriteLn('Standart trunc: ', T);

T := GetTickCount;
for i := 0 to $FFFFFF do
k := (word(d_w[3] shl 11) or (d_w[2] shr 5) or $8000)
shr (14 - (d_w[3] shr 4 and $03FF));
T := GetTickCount - T;
WriteLn('My trunc: ', T);

T := GetTickCount;
for i := 0 to $FFFFFF do
d1 := 1/d;
T := GetTickCount - T;
WriteLn('Floating point division: ', T);

ReadLn;
end.


Программа на моём селероне с 600 мегагерцами вывела вот что:
Код

Standart trunc: 1913
My trunc: 681
Floating point division: 1582

Результат налицо - стандартный транк медленнее даже столь дорогостоящей операции, как вещественное деление. Изврат, использующий внутренню структуру типа double, оказался намного быстрее.

Для турбо паскаля аналогичная проверка выглядит так:


var
i: longint;
d, d1: double;
k: integer;
Time: longint absolute $0040: $006C;
T: longint;
d_w: array [0 .. 3] of word absolute d;

begin
d := 1234.5678;

T := Time; while T = Time do; T := Time;
for i := 0 to $FFFFFF do
k := trunc(d);
T := Time - T;
WriteLn('Standart trunc: ', T);

T := Time; while T = Time do; T := Time;
for i := 0 to $FFFFFF do
k := ((d_w[3] shl 11) or (d_w[2] shr 5) or $8000)
shr (14 - (d_w[3] shr 4 and $03FF));
T := Time - T;
WriteLn('My trunc: ', T);

T := Time; while T = Time do; T := Time;
for i := 0 to $FFFFFF do
d1 := 1/d;
T := Time - T;
WriteLn('Floating point division: ', T);
end.



Программа показала вот что:
Код

Standart trunc: 58
My trunc: 7
Floating point division: 27

Тут результат ещё более на лицо.

Доктор, доктор, что мне делать по этому поводу?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 7:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name