Zitat von
Muetze1:
Zitat von
Amateurprofi:
Ich verwende dagegen den TimeStampCounter, der mit der CPU-Taktfrequenz tickt, was deutlich präzisere Messungen ermöglicht als GetTickCount oder QueryPerformanceCounter.
Der QPC greift intern bei einem vorhandenen TSC auf diesen zu (ausser es wird explizit verboten, u.a. durch den boot.ini switch /usepmtimer). Wenn kein TSC vorhanden ist wird versucht HW Timer2 zu nutzen, aber das ist nicht immer möglich. Von daher kann es sehr gut vorkommen, dass die Funktion false zurück gibt, wenn kein TSC auf der CPU vorhanden ist und der Timer2 benutzt wird.
Timer1 wird (warum auch immer) weiterhin seit IBM's Massenverkauf mit seinen 18,2 IRQs pro Sekunde.
@Mütze1:
Ja, das mag so sein.
Das ändert aber nichts an der Richtigkeit meiner Aussage, daß der TSC deutlich schneller tickt, als QPC.
qpc tickt (auf meinem Rechner) mit ca. 3.58 MTicks/s
tsc tickt (auf meinem Rechner) mit ca. 2.65 GTicks/s, also 740 mal so schnell wie qpc
Delphi-Quellcode:
PROCEDURE TMain.Test;
var tick,tick1:cardinal; tsc,tsc1,qpc,qpc1:int64;
FUNCTION TimeStamp:int64;
asm
rdtsc
end;
begin
queryperformancecounter(qpc);
tsc:=timestamp;
tick:=GetTickCount;
sleep(2000);
tick1:=GetTickCount;
tsc1:=timestamp;
queryperformancecounter(qpc1);
tick:=tick1-tick;
tsc:=tsc1-tsc;
qpc:=qpc1-qpc;
ShowMessage('
ticks '+IntToStr(tick)+#13+
'
qpc '+IntToStr(qpc)+'
'+IntToStr(qpc*1000
div tick)+'
ticks/s'#13+
'
tsc '+IntToStr(tsc)+'
'+IntToStr(tsc*1000
div tick)+'
ticks/s');
end;