[so] timpi pe Windows ?
George Adrian Drumea
so@cursuri.cs.pub.ro
Mon, 22 Nov 2004 01:36:29 +0200
AD> Au fost sugerate 2 functii pentru a luat timpul pe Windows (GetSystemTime,
AD> GetProcessTimes). Prima intoarce o structura SYSTEMTIME, a doua intoarce 3
AD> structuri FILETIME. Chit ca pentru FILETIME exista o functie de comparare,
AD> pentru nici una din cele 2 nu stiu sa existe functii relative la operatii
AD> matematice (in cazul nostru diferenta).
AD> deci : 1) Merge operatorul minus ? Eu unul ma indoiesc. 2) Exista vreun mod
AD> elegant de a face diferenta ?
__int64 operator-(const FILETIME &t1, const FILETIME &t2)
{
return *(__int64 *)&t2-*(__int64 *)&t1;
}
DI> Relativ la asta, nu s-ar putea folosi GetTickCount()?
DI> Intoarce un DWORD.
Daca folosesti GetTickCount rezolutia nu poate fi mai buna de 10ms
(deci nu se recomanda pentru cumularea timpilor I/O in cazul de
I/O-uri mici si dese). Este o alegere buna si comoda pentru ALLtime.
In windows, chiar daca FILETIME are unitatea de masura de 100ns, rezolutia
efectiva este data tot de frecventa intreruperii de ceas (deci tot
milisecunde). Un workaround ar fi folosirea functiilor
QueryPerformanceFrequency/Counter pentru perioade scurte, combinate cu
GetTickCount pentru perioade mai lungi. (Problema cu
QueryPerformanceFrequency este ca nu exista specificatii precise
asupra frecventei, deci nu se stie limita de wrap-around. Se poate
considera totusi in mod practic ca ea nu depaseste frecventa
procesorului, si atunci pentru cele mai rapide procesoare existente,
tot mai raman 2^32 secunde pana la wrap around, ceea ce este
suficient).
Ca observatie paralela, in cazul testarii programului cu sursa de test
de pe site (care efectueaza I/O in blocuri de 10k), overheadul
masurarii (al trimiterii pachetelor de notificare catre server) este
considerabil. Acest lucru duce la o diferenta mare intre suma
CPUtime+IOtime si ALLtime, deoarece timpul petrecut in rutinele de
trimitere a notificarilor este in principal timp petrecut in
WriteFile (pe mailslot), necronometrat de dll si cumulat de sistem ca
timp kernel (nu se aduna la user time in GetProcessTimes).
Un articol interesant (printre multe altele) pe tema aceasta se gaseste la:
http://msdn.microsoft.com/msdnmag/issues/04/03/HighResolutionTimer/default.aspx
Best regards,
George mailto:georgedrumea@rdslink.ro