[ Pharos @ 23.03.2006. 00:56 ] @
Radim one male zadačiće na www.z-trening.com Kako ja da saznam koliko je vremena potrebno da se kompajlira moj program i koliko je memorije potrebno za izvršanje tog programa? Hvala! |
[ Pharos @ 23.03.2006. 00:56 ] @
[ NrmMyth @ 23.03.2006. 13:14 ] @
Citat: vremena potrebno da se kompajlira moj program to neces lako saznati Citat: koliko je memorije potrebno za izvršanje tog programa zbroji sve "varijable" nizove i slicno [ Pharos @ 23.03.2006. 14:04 ] @
Pa da je lako saznati ne bih pitao ovde :D
Znam da postoji način da se to izračuna. A za ovo drugo sigurno postoji neko elegantnije rešenje od čiste fizikalije. Šta ako imam 300 varijabli, nizova, etc.? Hoću li i to brojati jednu po jednu? pOz [ mulaz @ 23.03.2006. 14:20 ] @
na linuxu imas za vreme komandu `time`
Code: bash-3.1$ time g++ test.cpp -Wno-deprecated real 0m0.866s user 0m0.748s sys 0m0.096s bash-3.1$ [ Pharos @ 23.03.2006. 14:33 ] @
Meni to treba isključivo za windows. Najbolje bi bilo ako MS VS ima opciju za tako nešto, mada ne pravim razliku za kompajlere i grafička okruženja. Lako se radi copy/paste.
[ stargazer @ 23.03.2006. 17:33 ] @
Citat: Meni to treba isključivo za windows. Najbolje bi bilo ako MS VS ima opciju za tako nešto, mada ne pravim razliku za kompajlere i grafička okruženja. Lako se radi copy/paste. Ja imam MSVS 2003 i opcija tajmiranja kompilacije nalazi se : Tools > Options > Projects -> VC++ Build -> Build Timing [Ovu poruku je menjao stargazer dana 23.03.2006. u 18:34 GMT+1] [ NrmMyth @ 23.03.2006. 18:35 ] @
Citat: Pharos: Pa da je lako saznati ne bih pitao ovde :D Znam da postoji način da se to izračuna. A za ovo drugo sigurno postoji neko elegantnije rešenje od čiste fizikalije. Šta ako imam 300 varijabli, nizova, etc.? Hoću li i to brojati jednu po jednu? pOz Na z-treningu nikada neces imati 300 varijabli, uvrh glave 10 razlicitih "varijabilnih objekata" istovremeno. Nema potrebe za detaljnom analizom, samo kalkuliraj vece nizove. [Ovu poruku je menjao NrmMyth dana 23.03.2006. u 19:40 GMT+1] [ dimitar 16 @ 23.03.2006. 21:03 ] @
Za memorija mozes da proveris u Task Manager/Processes
[ dimitar 16 @ 23.03.2006. 21:09 ] @
A za vreme izvrsavanja (ne verujem da ti je bitno vreme kompajliranja), evo ti pascal kod, pa si ga prisposobi za C++
Code: unit times; interface uses dos; procedure pocetok; procedure krajj; implementation var c1, c2, m1, m2, s1, s2, st1, st2, m, s, st: word; procedure pocetok; begin gettime (c1, m1, s1, st1); end; procedure krajj; begin gettime (c2, m2, s2, st2); writeln; writeln; if st2 < st1 then begin st:= st2 + 100 - st1; dec (s2); end else st:= st2 - st1; if s2 < s1 then begin s:= s2 + 60 - s1; dec (m2); end else s:= s2 - s1; if m2 < m1 then begin m:= m2 + 60 - m1; dec (c2); end else m:= m2 - m1; writeln (m,' : ',s,' : ',st); readln; end; end. [ Pharos @ 23.03.2006. 22:39 ] @
Hvala stargazer-u. Ovo me je interesovalo onako uopšteno. Z-trening sam spomenuo čisto da znate o čemu se radi.
@dimitar 16 Jel možeš ovo prevesti u C/C++? Ne znam paskal, nikad ga nisam učio, a nešto mi se ne da da krenem s učenjem da bih uspeo ovo da dešifrujem :D Hvala svima! [ stargazer @ 23.03.2006. 23:06 ] @
Citat: Jel možeš ovo prevesti u C/C++? Ne znam paskal, nikad ga nisam učio, a nešto mi se ne da da krenem s učenjem da bih uspeo ovo da dešifrujem :D Ovo što je čovek napisao je jednostavno dobijanje trenutnog vremena, pre i posle izvršavanja koda između ta dva poziva i proračun koliko ga je proteklo. [ z@re @ 24.03.2006. 02:39 ] @
Uvrsti time.h u program. Definiraj dvije varijable tipa clock_t, recimo start i finish, i jednu double varijablu, recimo elapsed. Tamo gdje trebas pocet sa "stopanjem vremena", udri start = clock();, gdje trebas zavrsit finish = clock();.
razlika izmedju finish i start je razlika broja otkucaja procesora izmedju ta dva checkpointa. u time.h je definirana konstanta koja kaze koliko procesor ima otkucaja po sekundi, ilitiga CLOCKS_PER_SEC. znaci vrijeme izvsavanje koda izmedju prve i druge clock linije je Code: elapsed = (double)(finish - start) / CLOCKS_PER_SEC; E sad, ako zelis sto preciznije, a nisu ti dostupni alati kao time pod UNIXima, ili neki malo profesionalniji analiticki alati, nisi u zavidnoj situaciji. Glupo je prvi checkpoint stavljat na pocetak main-a, a drugi na kraj, pa mjerit i negdje izbacit rezultat (ili debuggerom), jer ce same te komande dodatno povecat vrijeme izvsavanja programa, koje je bespotrebno. Isto tako, nece biti mjereno par assemblerskih komandi, tipa ulazak u main, setiranje enviromenta i izlazak iz main-a. Evo sad dok ovo pisem mi je sinila ideja kako bi mogao ovo pod Windowsima. Ajd cek dok se rebootam... [ z@re @ 24.03.2006. 03:19 ] @
http://www.pc-tools.net/win32/ptime/
E to je to. Program slican time(1) alatu pod UNIXom, rezolucija mu je 5ms. Citat: D:\programs\registered\dcpp\bin>ptime gcc -c test.c -o test.exe ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/ Copyright(C) 2002, Jem Berkes <[email protected]> === gcc -c test.c -o test.exe === test.c:8:2: warning: no newline at end of file Execution time: 0.057 s D:\programs\registered\dcpp\bin> test.c je nesto ala "Hello World". Sistem je P4 2.0. Tesko da ces ista uspjet iskompajlirat ispod 5ms. Tako da je adekvatno. Sta se tice drugog pitanja, tj. kako ces provjeriti koliko ti memorije zauzima program. Ako treba zauzece memorije, lista procesa na bilo kojem sistemu ce dati odgovor. Ako provjeravas koliko su zauzele tvoje interne varijable, a ne koristis nikakav analiticki softver, ima jedno dobro i jednostavno rjesenje. Caka je u tome da za sve varijable za koje radis dinamicku alokaciju, napravis svoju funkciju za dinamicku alokaciju. Nesto ala : Code: #include<stdio.h> #include<stdlib.h> size_t INTERNAL_MEMORY = 0; void * my_malloc(size_t size); int main() { int a; INTERNAL_MEMORY += sizeof(int); int b; INTERNAL_MEMORY += sizeof(int); double c; INTERNAL_MEMORY += sizeof(double); char *goo = (char *)my_malloc(sizeof(char) * 100); printf("%d\n", INTERNAL_MEMORY + sizeof(size_t)); system("PAUSE"); return EXIT_SUCCESS; } void * my_malloc(size_t size) { void * temp = (void *)malloc(size); if(temp != NULL) INTERNAL_MEMORY += size; return temp; } [ tosa @ 24.03.2006. 05:48 ] @
Time (samo delimicno) resavas pitanje zauzete memorije, tacnije dobijas podatak koliko je memorije
dinamicki alocirano i nista vise. U tu racunicu nece biti uracunata velicina executable-a, stack-a, data segmenta i slicno. [ z@re @ 27.03.2006. 23:08 ] @
Citat: tosa: Time (samo delimicno) resavas pitanje zauzete memorije, tacnije dobijas podatak koliko je memorije dinamicki alocirano i nista vise. U tu racunicu nece biti uracunata velicina executable-a, stack-a, data segmenta i slicno. Istina, ali mislim da covjek zeli mjerit memoriju radi ovih zadataka. Sta bi se reklo da ti netko da zadatak s kojim radis operacije nad stringovima, a da pri tome zauzmes samo 2 kb memorije. Znaci ono sta programer moze direktno manipulirat iz koda. Koliko ja znam velicinu executablea odreduje kompajler, sta se tice stacka i data segmenta to mogu biti i OS specificne manipulacije. Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|