取得自从开机到现在CPU运行的周期数,超毫秒级的精度
function Ticker: int64; register;
var
T : int64Rec;
begin
asm
db $0f,$31
mov [T.Lo],EAX
mov [T.Hi],EDX
end;
Result := int64(T);
end;
****************************************
const
D32 = $66;
function RDTSC: comp;
var
TimeStamp : record
case byte of
1: (Whole: comp);
2: (Lo, Hi: LongInt);
end;
begin
asm
db $0F; db $31; {BASM doesn't support RDTSC}
{Pentium RDTSC - Read Time Stamp Counter - instruction}
{$ifdef Cpu386}
mov [TimeStamp.Lo],eax // the low dword
mov [TimeStamp.Hi],edx // the high dword
{$else}
db D32
mov word ptr TimeStamp.Lo,AX
{mov [TimeStamp.Lo],eax - the low dword}
db D32
mov word ptr TimeStamp.Hi,DX
{mov [TimeStamp.Hi],edx - the high dword}
{$endif}
end;
Result := TimeStamp.Whole;
end;
type
CompStr = string[25];
{Comps have up to 18 digits, plus commas, and sign}
function CompToStr(N: comp): CompStr;
var
Low3 : string[3];
N1 : extended;
begin
if N < 0 then
Result := '-' + CompToStr(-N)
else
begin
N1 := N / 1000;
Str(Round(Frac(N1) * 1000), Low3);
N := Int(N1);
if N > 0
then
begin
while Length(Low3) < 3 do
Low3 := '0' + Low3;
Result := CompToStr(N) + ThousandSeparator + Low3;
end
else
Result := Low3
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//showmessage(inttostr( Ticker));
memo1.Lines.Add(CompToStr(RDTSC));