Forum » Programiranje » c++ čas izvajanja ukaza
c++ čas izvajanja ukaza
fogl ::
Zanima me koliko čas porabi računalnik da izračuna npr. vrednost za sin(x), koliko časa izvaja določeno zanko... Verjetno je to odvisno tudi od hitrosti procesorja. A obstaja kakšen simulator za to?
Zanima me kako točn je ukaz:
_sleep(250); /*250 ms delay*/
A traja pri vsakem procesorju enako dolgo?
Zanima me kako točn je ukaz:
_sleep(250); /*250 ms delay*/
A traja pri vsakem procesorju enako dolgo?
Vesoljc ::
če delaš na Win platformi, lahko za merjenje uporabiš QueryPerformanceCounter funkcijo, ki mislim, da je časovno zelo natančna...
obstaja pa tudi ena funkcija (v asm, če se ne motim), ki ti vrne točno število ciklov, ki jih neka funkcija porabi...
samo, zdele na pamet se je res ne spomnim...
glede sleep-a, pa mislim, da je natančen na +- milisekundo
in ja, na vseh procesorjih, bi "moral" trajati enako dolgo (+-milisekunda)
obstaja pa tudi ena funkcija (v asm, če se ne motim), ki ti vrne točno število ciklov, ki jih neka funkcija porabi...
samo, zdele na pamet se je res ne spomnim...
glede sleep-a, pa mislim, da je natančen na +- milisekundo
in ja, na vseh procesorjih, bi "moral" trajati enako dolgo (+-milisekunda)
Abnormal behavior of abnormal brain makes me normal...
fogl ::
Kje pa sploh je platforma? (Drgač ma win-xp pa visual c++ 6) Kje pa najdem to QueryPerformanceCounter funkcijo?
Senitel ::
Imaš dve funkciji QueryPerformanceCounter in QueryPerformanceFrequency. Kako misliš "kje jo najdem"?
fogl ::
Sem mislil da je to nekje v oridni vrstici, da pač vklopiš neko funkcijo ki ti meri čas. A potem je potrebno to funkcijo vstavit v program? (sem še začetnik, zato razumi moja vprašanja, čeprav so za nekoga ki obvlada lahko neumna)
A mi lahko napišeš en kratek primer, kako zgleda tak progremček?
A mi lahko napišeš en kratek primer, kako zgleda tak progremček?
CCfly ::
Za Linux je Valgrind. Drugace pa lahko preprosto v kodi shranis cas zacetka izvajanja in cas konca izvajanja.
Vesoljc ::
problem je le natančnost, to se deloma rešit z računanjem povprečja (se pravi, narediš 1000 iteracij ter zračunaš povprečen čas), težave znajo nastopiti edinole ko meriš kaj res hitrega, naprimer operacijo ali dve...
en primer:
seštevanje in "nastavitev" vrednosti (assignment) sta tako hitri operaciji, da na njun povprečni čas vpliva že izvajanje for zanke...
kako to rešit? simple, matematika rulz...
A - čas zanke
B - čas operacije
T1,T2 - pretekla časa
100000A + 100000B = T1
20000A + 100000B = T2
izpostaviš, izenačiš ter zračunaš B... da je vse za ziher meritev ponoviš ene miljonkrat
[edit] pa sem najdu :)
meritev ciklov:
en primer:
timer.Start(); for(int i = 0; i<100000; ++i) a = b + c; timer.Stop();
seštevanje in "nastavitev" vrednosti (assignment) sta tako hitri operaciji, da na njun povprečni čas vpliva že izvajanje for zanke...
kako to rešit? simple, matematika rulz...
timer.Start(); for(int i = 0; i < 100000; ++i) a = b + c; timer.Stop(); //T1 timer.Start(); for(int i = 0; i < (100000/5); ++i) { a = b + c; a = b + c; a = b + c; a = b + c; a = b + c; } timer.Stop(); //T2
A - čas zanke
B - čas operacije
T1,T2 - pretekla časa
100000A + 100000B = T1
20000A + 100000B = T2
izpostaviš, izenačiš ter zračunaš B... da je vse za ziher meritev ponoviš ene miljonkrat
[edit] pa sem najdu :)
meritev ciklov:
//more header files might be included #include <stdio.h> #include <memory.h> #include <fstream> #include <iostream> #include <stdlib.h> #include <vector> #include <fcntl.h> #include <algorithm> #include <malloc.h> #include <windows.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> using namespace std; __int64 clockCycles; __forceinline void CountCycles() { __asm { RDTSC mov DWORD PTR[ clockCycles + 4 ], edx mov DWORD PTR[ clockCycles ], eax } } enum { uiFunctionCallNum = 1000 }; int main() { SetPriorityClass( GetCurrentProcess(), HIGH_PRIORITY_CLASS ); SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_HIGHEST ); unsigned int uiMinCycles = 0xffffffff; unsigned int uiCyclesDiffSum = 0; for ( int i = 0; i < 30; ++i ) { CountCycles(); __int64 CyclesStart = clockCycles; ////////////// FUNCTION CALL HERE //////// ////////////////////////////////////////// CountCycles(); unsigned int uiCyclesDiff = (unsigned int)( clockCycles - CyclesStart ); if ( uiCyclesDiff < uiMinCycles ) { uiMinCycles = uiCyclesDiff; } uiCyclesDiffSum += uiCyclesDiff; } SetPriorityClass( GetCurrentProcess(), NORMAL_PRIORITY_CLASS ); SetThreadPriority( GetCurrentThread(), THREAD_PRIORITY_NORMAL ); cout << endl << endl << "Minimal CPU cycles : " << uiMinCycles << endl; return 0; }
Abnormal behavior of abnormal brain makes me normal...
Zgodovina sprememb…
- spremenil: Vesoljc ()
fogl ::
Kater header file pa moram vključit, da bo timer.start() in timer.stop() definiran, ker mi ves čas napako javlja?
Vesoljc ::
hehe, timer je izmišljen/pseudo class oziroma objekt
lepo poglej kako so narejeni timer-ji (linke sem dal malo višje) pa naredi svojega... vsega ti pa ne moremo dati na pladnju
lepo poglej kako so narejeni timer-ji (linke sem dal malo višje) pa naredi svojega... vsega ti pa ne moremo dati na pladnju
Abnormal behavior of abnormal brain makes me normal...
fogl ::
Aha...bom zej začel mal migat Še nekej me zanima...ko bom imel to funkcijo za tajmer, potem bo ta tajmer štel tudi čas, ki ga bo porabil, da se bo izvedla ta funkcija tajmer?
Vesoljc ::
recimo, da ne
ena zadnjih operacij, ki jih funkcija "tajmer" naredi je, da označi trenutni čas. nato sledi izvjanje nove fukcije (ali skok na funkcijo ali inline koda), ki jo ti meriš, ko se ta konča se zopet lahko pojavi skok ali kar koda... hitreje mislim, da ne gre... lahko pa ti sam, v glavi narediš en račun ter tako rahlo aproksimiraš
ena zadnjih operacij, ki jih funkcija "tajmer" naredi je, da označi trenutni čas. nato sledi izvjanje nove fukcije (ali skok na funkcijo ali inline koda), ki jo ti meriš, ko se ta konča se zopet lahko pojavi skok ali kar koda... hitreje mislim, da ne gre... lahko pa ti sam, v glavi narediš en račun ter tako rahlo aproksimiraš
Abnormal behavior of abnormal brain makes me normal...
fogl ::
Profiling is supported only in Visual C++ Professional and Enterprise Editions (piše v msdn library). Jest mam pa standard edition.
lp, klemen
Zgodovina sprememb…
- spremenil: fogl ()
fogl ::
Sem si dal gor visual c++ 6 profesonal edition...profiler deluje
Mal več o tem si lahko pogledate tukaj.
Mal več o tem si lahko pogledate tukaj.
lp, klemen
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | C++ Časovno testiranje kodeOddelek: Programiranje | 831 (779) | zacetnik11 |
» | [C] cas, time_tOddelek: Programiranje | 1572 (1410) | Imortales |
» | Funkcije v dev-c++ - HElp neededOddelek: Programiranje | 1405 (1289) | bozjak |
» | Najhitrejši programski jezik? (strani: 1 2 )Oddelek: Programiranje | 7707 (5527) | Senitel |
» | c++ parallel portOddelek: Programiranje | 1029 (909) | slawc |