====== Travailler avec le temps ======
===== Temps super précis =====
== QueryPerformanceCounter ==
''QueryPerformanceCounter'' récupère la valeur actuelle du compteur de performance, qui est un horodateur à haute résolution (<1µs) pouvant être utilisé pour les mesures d'intervalles de temps.
''QueryPerformanceFrequency'' est une valeur fixe, on peut la stocker dans une valeur et utiliser cette valeur, pas besoin de faire un appel a chaque fois a cette API.
function QPC: int64;
begin
if not QueryPerformanceCounter(Result)
then Result:=-1;
end;
function QPF: int64;
begin
if not QueryPerformanceFrequency(Result)
then Result:=-1;
end;
function QPCToMicrosecond(const AQPC: int64): Double;
begin
Result:=(AQPC*1000000) / QPF;
end;
function QPCToMillisecond(const AQPC: int64): Double;
begin
Result:=(AQPC*1000) / QPF;
end;
Sources:
* [[https://docs.microsoft.com/fr-fr/windows/win32/sysinfo/acquiring-high-resolution-time-stamps]]
* [[https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancecounter]]
* [[https://docs.microsoft.com/en-us/windows/win32/api/profileapi/nf-profileapi-queryperformancefrequency]]
== RDTSC ==
Surement le temps le plus petit avec lequel on peut travailler.
Sur mon PC RDTSC retourne une valeur 266x superieur a ''QueryPerformanceCounter'' (voir ci-dessus).\\
Et comme par hasard la vitesse de mon processeur est de 2.66Ghz
function HardwareTicks: int64; assembler;
asm
RDTSC;
end;
Aprés je n'ai pousser l'experience plus loin,\\
a savoir comment recuperer la vitesse du processeur pour convertir le temps RDTSC en microsecondes ou nanosecondes.
Et quid des processeurs dont la vitesse varie en fonction de la charge ???