» »

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?

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)
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?

Vesoljc ::

> A mi lahko napišeš en kratek primer, kako zgleda tak progremček?

kein problem...
klik

ummm...
Abnormal behavior of abnormal brain makes me normal...

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:
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
:D 8-) ;)


[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 :D
lepo poglej kako so narejeni timer-ji (linke sem dal malo višje) pa naredi svojega... vsega ti pa ne moremo dati na pladnju 8-)
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š :D
Abnormal behavior of abnormal brain makes me normal...

hatch ::

Normalni ljudje uporabljamo profiler.

fogl ::

Kaj pa je to profiler? Kako se ga pa uporablja?
lp, klemen

hatch ::

to je zadevca ki ti meri koliko casa ti pobere vsaka funkcija, loop, ...

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 :D
Mal več o tem si lahko pogledate tukaj.
lp, klemen


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C++ Časovno testiranje kode

Oddelek: Programiranje
5785 (733) zacetnik11
»

[C] cas, time_t

Oddelek: Programiranje
171418 (1256) Imortales
»

Funkcije v dev-c++ - HElp needed

Oddelek: Programiranje
131338 (1222) bozjak
»

Najhitrejši programski jezik? (strani: 1 2 )

Oddelek: Programiranje
757409 (5229) Senitel
»

c++ parallel port

Oddelek: Programiranje
10979 (859) slawc

Več podobnih tem