Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Schimbare adresa DNS IPv4 pe rout...

Recomandare Barebone

Monede JO 2024

Suprasolicitare sistem electric
 CIV auto import

Mutare in MOZAMBIC - pareri, expe...

Scoatere antifurt airtag de pe ha...

Magnet in loc de clește pent...
 Cumparat/Locuit in apartament si ...

Pot folosi sistemul PC pe post de...

Sokol cu distorsiuni de cross-over

Filtru apa potabila cu osmoza inv...
 Kanal D va difuza serialul “...

Upgrade xiaomi mi11

securitate - acum se dau drept - ...

Farmacia Dr Max - Pareri / Sugest...
 

Masurarea duratei unei operatii

- - - - -
  • Please log in to reply
8 replies to this topic

#1
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
Deseori intalnim nevoia de a vedea cat anume dureaza o anumita operatie/functie/algoritm.

Daca ne multumeste precizia unei secunde, acest lucru este usor de aflat folosind time_t si functii specifice. Deseori avem insa nevoia de o precizie mai mare.

Pentru aceasta, sub Windows, se pot folosi doua functii: QueryPerformanceCounter, respectiv QueryPerformanceFrequency. Este necesar a fi inclus headerul corespunzator:

#include <Windows.h>

Prima ne returneaza un numar foarte mare ce reprezinta numarul de counteri "trecuti" pana in prezent, iar a doua ne indica cati astfel de counteri sunt numarati pe secunda. Practic apelam QueryPerformanceCounter odata inainte si odata dupa finalizarea operatiei, iar apoi impartim diferenta la rezultatul returnat de QueryPerformanceFrequency, obtinand astfel numarul de secunde trecute.

Precizia este foarte buna, la mine fiind de 1/2533304 secunde (0.39 microsecunde)

Pentru a simplifica utilizarea, am creat doua macrouri:

#define START_COUNTER \
	LARGE_INTEGER counter__start, counter__end, counter__frec; \
	QueryPerformanceFrequency(&counter__frec); \
	QueryPerformanceCounter(&counter__start); 
#define STOP_COUNTER ((double)(QueryPerformanceCounter(&counter__end), counter__end.QuadPart - counter__start.QuadPart) / counter__frec.QuadPart)


Exemplu:

START_COUNTER;
printf("%u\n", sumaDivizori(0xFFFFFFFF));	
double secunde_durata = STOP_COUNTER; //numarul de secunde trecute


Solutii pentru alte sisteme de operare/cross-platform sunt bine venite.

#2
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009
Rezultatul ala e in microsecunde. Cred ca ar trebui sa-l inmultesti cu 1000 undeva in definitia macroului ca sa-ti dea milisecunde care sunt mai de folos utilizatorului...

#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
Conform documentatiei rezultatul e

Quote

in counts per second
.


#4
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009
Poti sa testezi si singur. Masoara cat dureaza de exemplu executia:
sleep (1000)
Ia vezi, codul tau iti returneaza 1 sau 1000000?

Zic doar pentru ca am folosit acelasi cod dar in Visual Basic si acolo aveam (Stop - Start) * 1000 / Frequency ca sa-mi returneze milisecunde.

#5
neagu_laurentiu

neagu_laurentiu

    Guru Member

  • Grup: Senior Members
  • Posts: 40,603
  • Înscris: 30.07.2003

 dani.user, on 06 decembrie 2013 - 20:53, said:

Practic apelam QueryPerformanceCounter odata inainte si odata dupa finalizarea operatiei, iar apoi impartim diferenta la rezultatul returnat de QueryPerformanceFrequency, obtinand astfel numarul de secunde trecute.
Dar nu reprezinta timpul exact aferent codului dintre aceste apeluri. El e influentat si de restul aplicatiilor rulate in paralel (real ori simulat). Valorile obtinute sunt altele la fiecare rulare.

Edited by neagu_laurentiu, 06 December 2013 - 23:57.


#6
JayBird

JayBird

    IT Professional

  • Grup: Senior Members
  • Posts: 2,511
  • Înscris: 15.09.2009
Pai e cea mai precisa metoda de masurare la care ai acces, alta nu e. Mie mi-a fost foarte folositoare in a descoperi ce parte de cod dureaza prea mult si trebuie optimizata.

#7
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007

 JayBird, on 06 decembrie 2013 - 22:50, said:

Poti sa testezi si singur. Masoara cat dureaza de exemplu executia:
sleep (1000)
Ia vezi, codul tau iti returneaza 1 sau 1000000?

Zic doar pentru ca am folosit acelasi cod dar in Visual Basic si acolo aveam (Stop - Start) * 1000 / Frequency ca sa-mi returneze milisecunde.

1.0006813228716456
Si da, ar trebui inmultit cu 1000 pentru a arata milisecundele.

 neagu_laurentiu, on 06 decembrie 2013 - 23:56, said:

Dar nu reprezinta timpul exact aferent codului dintre aceste apeluri. El e influentat si de restul aplicatiilor rulate in paralel (real ori simulat). Valorile obtinute sunt altele la fiecare rulare.

Nu exact, corect, dar suficient, mai ales daca rulezi de mai multe ori (fara sa rulezi prea multe in paralel) si faci o medie, pentru a avea o idee pe unde te alfii.

#8
OriginalCopy

OriginalCopy

    I'm harmful, fear me please! :))

  • Grup: Senior Members
  • Posts: 27,268
  • Înscris: 10.08.2006
Mai bine foloseşti un profiler. Dacă proiectul la care lucrezi nu a ajuns încă la stadiul la care are sens să-i faci profiling, simplele gânduri despre complexitatea algoritmică sunt suficiente.

Compilatoarele folosite de obicei pot instrumenta binarele pentru profiling, în care aş avea mai multă încredere.

Profiling pentru unit tests cu code coverage mare (sau măcar lucrurile ştiute a fi lente: algoritmii lenţi sau cele care implică accesul la resurse lente gen hard disk sau reţea) şi eşti în siguranţă.

În plus, ţinerea unui ochi pe durata de execuţie a unit tests poate fi automatizată, în special dacă ai şi continuous integration în bucla de dezvoltare.

Exemplu, KCacheGrind:

[ http://kcachegrind.sourceforge.net/html/pics/KcgShot2.png - Pentru incarcare in pagina (embed) Click aici ]

#9
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,236
  • Înscris: 24.02.2007
O solutie de profiling pentru cine nu-si permite versiunile de Visual Studio ce vin cu interfata dedicata pentru asa ceva: http://www.codeproje...al-Studio-for-F

Anunturi

Chirurgia endoscopică a hipofizei Chirurgia endoscopică a hipofizei

"Standardul de aur" în chirurgia hipofizară îl reprezintă endoscopia transnazală transsfenoidală.

Echipa NeuroHope este antrenată în unul din cele mai mari centre de chirurgie a hipofizei din Europa, Spitalul Foch din Paris, centrul în care a fost introdus pentru prima dată endoscopul în chirurgia transnazală a hipofizei, de către neurochirurgul francez Guiot. Pe lângă tumorile cu origine hipofizară, prin tehnicile endoscopice transnazale pot fi abordate numeroase alte patologii neurochirurgicale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate