[ 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!
[ 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.