Cum afli timpul de executie al unei aplicatii in C/C++?
7Participarea la olimpiada de informatica este foarte importanta. In timp ce ne pregatim trebuie sa stim daca algoritmul implementat are vreo sansa se inscrie in timpii ceruti de problema. Putem testa asta adaugand un mic snippet in codul nostru. In C++ vom avea nevoie de ctime iar in C de time.h.
#include<ctime> //in C++ #include<time.h> //in C double start , stop; //declaram variabilele start si stop
Unde dorim sa incepem masurarea timpului vom adauga
start=clock();
iar in locul unde dorim sa oprim contorizarea vom adauga
stop=clock();
Pentru a vedea timpul scurs in acel interval adaugati dupa linia de mai sus.
cout< <(stop-start)/CLOCKS_PER_SEC; //sau printf("%lf", (stop-start)/CLOCKS_PER_SEC); in C
Atentie!
Daca datele de intrare la veti scrie manual de la tastatura iar aceste operatii sunt incluse in perioada de calcul, atunci timpul scurs va lua in calcul si timpul pierdut pentru scrierea datelor.
Daca acest articol contine o greseala, selecteaza cuvintele sau fraza gresita si tasteaza combinatia de taste Shift + Enter sau apasa click aici pentru a o raporta. Multumim!
Ai o mica greseala. Este CLOCKS_PER_SEC, nu CLOCK_PER_SEC. 😉
Am editat, a fost o mica scapare din partea mea.
Wow, multumesc. Chiar vroiam sa gasesc un timer de mult timp 😎
Doar o mica problema. Acest program calculeaza timpul dupa ticurile procesorului ceea ce inseamna ca in caz ca de exemplu porniti alte programe si ele ocupa procesorul timpul va difirentia. Faceti experimente, incarcati procesorul si porniti programul, apoi cu procesorul neincarcat si vedeti ce diferenta enorma face…
P.S.: Asta oricum e cea mai buna solutie :). Daca calculati dupa timpul real o sa primiti un Nr intreg(ceea ce nu e bun deloc cind iti tre milisecunde). Pentru un timp cit mai real incercati sa nu incarcati procesorul cu aplicatii diferite…
O alta varianta, valabila doar sub windows, este folosirea functiei GetTickCount , uni zic ca este mai precisa 🙂
Pe Windows: QueryPerformanceCounter() si QueryPerformanceFrequency().
De acord cu morpheust. Corect e sa se afle cpu time-ul folosit de respectivul thread, nu de aplicatie per se (trebuie in cazul respectiv tinut cont de utililizarea procesorului de alte threaduri, dar asta e o cu totul alta mancare de peste). Daca e sa folosim GetTickCount atunci ne furam singuri caciula fiindca e calculat timpul procesului (care proces poate fi incetinit de chiar sistemul de operare in functie de gradul de ocupare al procesorului per total).
Iar daca aplicatia e multi-thread, o simpla adunare a timpilor de executie a fiecarui thread e mai mult decat de ajuns (normalizata bineinteles).
Ca referinte as adauga:
http://www.codeproject.com/KB/system/processescpuusage.aspx
http://www.mkssoftware.com/docs/man3/pthread_getcpuclockid.3.asp