Also habe ich das richtig verstanden, dass Du einfach nur die Ticks auslesen willst ? Wenn ja, wieso dann so kompliziert ?
Delphi-Quellcode:
function GetTicks : UInt64;
register;
asm
rdtsc
{$IFDEF WIN64}
shl rdx, 32
or rax, rdx
{$ENDIF}
end;
Das sollte für rudimentäre Zwecke reichen. Willst Du ganz exaktes Messen veranstalten, da nimm doch die Routine von Agner Fog (Optimierungs Papst)
:
Delphi-Quellcode:
function GetTicks : UInt64;
asm
{$IFDEF CPUX64}
.NOFRAME
// by Agner Fog
push rbx
// ebx is modified by cpuid
sub rax, rax
// 0
cpuid
// serialize
rdtsc
// read time stamp counter into edx:eax
shl rdx, 32
or rax, rdx
// combine into 64 bit register
push rax
sub eax, eax
cpuid
// serialize
pop rax
// return value
pop rbx
ret
{$ELSE}
push ebx
// ebx is modified by cpuid
sub eax, eax
// 0
cpuid
// serialize
rdtsc
// read time stamp counter
push eax
push edx
sub eax, eax
cpuid
// serialize
pop edx
pop eax
pop ebx
ret
{$ENDIF}
end;
Um auf das "Tick" genau zu sein, müsstest Du dann zusätzlich die Funktion hintereinander aufrufen und die Differenz bilden. Bei späteren Messungen ist diese Differenz (verursacht von dem Funktionsaufruf) abzuziehen.
Gruß Thomas