Это программа для дельфы.
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
Тут результат ещё более на лицо.
Доктор, доктор, что мне делать по этому поводу?