[RIJESENO]Vrijeme izvodjenja

Ima li iko ideju kako napraviti timer koji ce mi izbaciti vrijeme izvodnjenja odredjenog dijela koda u milisekundama. rijec je o par implementacija umnoska dva broja. Znam napraviti da mi izbaci u sekundama al naravno da je prebrzo ovo sto se izvede pa izbaci 0 sekundi. Ako nekoga zanima kod evo postat cu ga:

[code]int pomnozi(int x, int y){
int umnozak=0;
while(x>=1){
if(x%2!=0)
umnozak+=y;

    x/=2;
    y*=2;
}
return umnozak;
}

int pomnoziRekurzivno(int x, int y){
if(x<=1) return y;
if(x%2!=0)
return y + pomnoziRekurzivno(x/2,y2);
else pomnoziRekurzivno(x/2,y
2);
}

int pomnozi2(int x, int y){
int umnozak=0;
while(x>0)
{
umnozak+=y;
x–;
}
return umnozak;
}

int pomnozi2rekurzivno(int x, int y){
if(x<=1)return y;
return y+ pomnozi2rekurzivno(x-1,y);
}[/code]
main se samo sastoji u pozivu ovih funkcija, a funkcije su definirane u h fileu. preostaje mi samo izracunati razliku vremena u izvodjenju. malo se igram. kod je takodjer malo nedotjeran al to mislim ostaviti za kasnije. citao sam i naletio na sys/resources.h. ono sto je pisalo na netu nije uspjelo al malo cu proceprkat po tom headeru mozda nadjem nesto zanimljivo.

EDIT: koristio sam sljedecu metodu koja mi vraca mikrosekunde sto je zapravo jos bolje jer je vremenska razlika izmedju metoda vrlo mala.

[code] timeval time;
long t;

gettimeofday(&time, NULL);
pomnozi(300,200);
t = time.tv_usec;
printf("%ld\n",t);[/code]

moze li itko ovo potvrditi da je tocno? ima li mozda jos koja metoda?

U biti tebi treba clock (man 3 clock) funkcija kako bi racunao cisto CPU vrijeme. Evo ti primjer:

clock_t start = clock(); pomnozi(300,200); printf("%f\n", ((double)clock() - start) / CLOCKS_PER_SEC);

[quote=Sanel]U biti tebi treba clock (man 3 clock) funkcija kako bi racunao cisto CPU vrijeme. Evo ti primjer:

clock_t start = clock(); pomnozi(300,200); printf("%f\n", ((double)clock() - start) / CLOCKS_PER_SEC);
[/quote]
da, to sam vec pokusao i izbacuje 0 takodjer. nisam siguran radi cega jer koliko sam shvatio treba mi izbaciti koliko je ciklusa procesor odradio u medjuvremenu jeli tako?

Onda vjerovatno funkcija nije ni vrijedna mjerenja, jer je procesor brzo izvrsi :wink:

U biti izbaci broj ciklusa po jednoj sekundi. Obzirom da je CLOCKS_PER_SEC oko 1000000, to znaci da ti treba bar toliko ciklusa da vidis neke promjene.

Btw. ako zelis ici malo dalje od clock(), mozes koristiti iz glibc-a pravo cool clock_gettime(), koji ti vrati potrosnju u nanosekundama, npr:

[code]struct timespec ts;
ts.tv_sec = ts.tv_nsec = 0;
clock_settime(CLOCK_PROCESS_CPUTIME_ID, &ts);
pomnozi(300, 200);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts);

printf(“%f %f\n”, ts.tv_sec, ts.tv_nsec);[/code]
i linkaj sa librt (-lrt). Mada, pretpostavljam da ce opet sve biti nule :slight_smile:

naveo sam u prvom postu u editu da sam dobio vrijeme izvodjenja u mikrosekundama samo me jos zanimalo ima li koja metoda jos. nisam gledao resources.h i pogledat cu cim mi se bude dalo. notacijom O() sam shvatio da neovisno o procesoru vrijeme izvodjenja ove funkcije

[code]int pomnozi(int x, int y){
int umnozak=0;
while(x>=1){
if(x%2!=0)
umnozak+=y;

    x/=2;
    y*=2;
}
return umnozak;
}[/code]

ima kompleksnost O(log n). sada me zanimala tocna vremenska razlika izmedju iterativne verzije i rekurzivne jer znam da je rekurzivna sporija radi piskaranja po stogu. a inace razlika izmedju iterativne koja ima O(log n) i rekurzivne koja ima O(n) kompleksnost je vrlo mala, nekih 100 mikrosekundi. ali vjerojatno se za dovoljno velik broj uocava neka razlika medju algoritmima. znam da nije moguce dobiti tocnu razliku u izvodjenju radi svega sto se izmedju desava ali je zanimljiv zadatak

A zašto ne koristiš time komandu iz konzole ? Također, ne možeš pratiti vrijeme izvođenja sa jednim test case-om…

ne znam sad jesam li ja tebe pogresno shvatio ili si ti mene. ugl, sve pozive funkcija sam stavio u isti main izmedju timestampova i svi su se izvodili slijedno u istom programu. vracao je uvijek razlicito vrijeme izvodjenja dijelova koda sto je bilo za ocekivati, ali relativno vrijeme izvodjenja izmedju funkcija je uvijek ostalo manje vise isto. pokretao sam vise puta program i vjerojatno treba prikupiti statistickih podataka o tome al to meni ne treba. dobio sam sto sam htio, a to su relativne brzine izvodjenja koje sam i ocekivao, samo su stvarni rezultati medjusobno blizi nego sto sam ja bio zamislio. vidio sam u jednom kodu usporedjivanja metoda sortiranja da je koristen timeb.h header koji na linuxu ne postoji? cini mi se da je visual c++ specific ali nisam razbijao glavu o tome

ne znam sad jesam li ja tebe pogresno shvatio ili si ti mene. ugl, sve pozive funkcija sam stavio u isti main izmedju timestampova i svi su se izvodili slijedno u istom programu. vracao je uvijek razlicito vrijeme izvodjenja dijelova koda sto je bilo za ocekivati, ali relativno vrijeme izvodjenja izmedju funkcija je uvijek ostalo manje vise isto. pokretao sam vise puta program i vjerojatno treba prikupiti statistickih podataka o tome al to meni ne treba. dobio sam sto sam htio, a to su relativne brzine izvodjenja koje sam i ocekivao, samo su stvarni rezultati medjusobno blizi nego sto sam ja bio zamislio. vidio sam u jednom kodu usporedjivanja metoda sortiranja da je koristen timeb.h header koji na linuxu ne postoji? cini mi se da je visual c++ specific ali nisam razbijao glavu o tome[/quote]
uzmi veci input za sortiranje , npr. 2 000 000 random generisanih brojeva onda ces tek primjetiti pravu razliku …

da, to sam vec spomenuo. napomena da se trenutno ne radi o sortiranju i da je vec rijeseno :slight_smile:

EDIT
jel mozda ovdje negdje bila opcija za promjenu naslova threada?

Kad edituješ prvi post možeš promijeniti i naslov threada.

hvala na uputstvu.