/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Måling af tid
Fra : Søren \"Pengman\" Pe~


Dato : 13-04-03 00:39

Hejsa folkens

Jeg er med i et projekt hvor vi skal lave nogle beregninger, og for at finde
ud af hvilke der er mest effektive ville vi må hvor hurtigt de udføres.

Mit spørgsmål er hvordan man kan aflæse tiden fra systemclocken??
ved at afsætte et tidspunkt før beregningen og et efter er det jo ret nemt
at finde ud af hvor lang tid den tager ;)

vi har fundet frem til en måde der ligner... men den regner i sekunder -
hvilket ikke er tilstrækkelig præsist...

Jeg håber I kan hjælpe

Søren



 
 
Klaus Petersen (13-04-2003)
Kommentar
Fra : Klaus Petersen


Dato : 13-04-03 10:53

Det afhænger af hvilket operativsystem i bruger, men bruger i windows, er
der mulighed for at bruge 2 windows api funktioner til formålet.

De hedder QueryPerformanceFrequency og QueryPerformanceCounter.

Den første funktion giver dig antal tællinger pr. sekundt, og den anden
giver dig den værdi, tælleren har i øjeblikket.

Definationen af de 2 funktioner er som følger:

BOOL QueryPerformanceFrequency(

LARGE_INTEGER *lpFrequency // address of current frequency
);

BOOL QueryPerformanceCounter(

LARGE_INTEGER *lpPerformanceCount // address of current counter value
);

Et lille eksempel på brugen af dem:

#include "windows.h"

LARGE_INTEGER freq;
LARGE_INTEGER start;
LARGE_INTEGER slut;
__int64 ms;

QueryPerformanceFrequency ( &freq );
QueryPerformanceCounter ( &start );

// gør et eller andet der skal tages tid på

QueryPerformanceCounter ( &slut );

ms = (slut.QuadPart - start.QuadPart) / (freq.QuadPart/1000);

Håber i kan bruge svaret til noget.

Klaus.



Michael Rasmussen (14-04-2003)
Kommentar
Fra : Michael Rasmussen


Dato : 14-04-03 09:17

"Klaus Petersen" <ng@spectual.ra.bnaa.dk> wrote in message
news:b7bc21$pmk$1@sunsite.dk...
> Det afhænger af hvilket operativsystem i bruger, men bruger i windows, er
> der mulighed for at bruge 2 windows api funktioner til formålet.
>
> De hedder QueryPerformanceFrequency og QueryPerformanceCounter.
>

Du skal dog lige være opmærksom på at der er en (i hvertfald teoretisk)
mulighed for at de ikke er tilstede på maskinen. I såfald retunerer
QueryPerformanceFrequency
og du får en integer division by zero exception, hvis du ikke tager højde
for det.
Så du bør lave lave fallback til GetTickCount().

- Michael Rasmussen



Mads Orbesen Troest (14-04-2003)
Kommentar
Fra : Mads Orbesen Troest


Dato : 14-04-03 19:17

On Sun, 13 Apr 2003 11:53:21 +0200, Klaus Petersen wrote:

> BOOL QueryPerformanceFrequency(
>
> LARGE_INTEGER *lpFrequency // address of current frequency
> );

Bemærk, inden du tolker for vildt på resultatet, at denne kan have ret så
lav opløsning på fx tidligere Windows versioner. Husk lige at checke
hvilken opløsning du egentlig har. Bemærk end videre ved "naiv" profiling
som denne, at det hele er dybt afhængig af cache situationen, så små
test/proof-of-concept programmer kører ofte MEGET hurtigere end i den
virkelige applikation det anvendes i, når/hvis data er spredt.

Mvh,
/\/\\ads Orbesen Troest

Troels Thomsen (15-04-2003)
Kommentar
Fra : Troels Thomsen


Dato : 15-04-03 09:30

> Bemærk end videre ved "naiv" profiling
> som denne, at det hele er dybt afhængig af cache situationen,

Ja !!,
Flg kode tager altid ca 80 'ticks' første gang, og ca 15 ticks de
efterfølgende gange på min maskine.

for (int i = 0 ; i < 5 ; ++i)
{
QueryPerformanceCounter(&lint1);
double a = sin(1);
QueryPerformanceCounter(&lint2);
TRACE("diff %d\n",lint2.QuadPart - lint1.QuadPart);
}

Det er jo initiering i sinus funktionen der åbenbart tager tid første gang.
Men er det ikke mærkeligt, det er jo bare en funktion? Har den noget a la:

double sinus ( double val)
{
static bool not_initiated = true;

if (not_initiated)
{
do something
not_initated = false;
}
do the sin calc
return sinus value
}

mvh Troels



Thomas Krog (20-04-2003)
Kommentar
Fra : Thomas Krog


Dato : 20-04-03 10:45

> Det er jo initiering i sinus funktionen der åbenbart tager tid første
gang.
> Men er det ikke mærkeligt, det er jo bare en funktion? Har den noget a la:

Oversætteren kender formodentlig implementeringen af sin og ved at den ikke
har nogle sidevirkninger i programmet. Da resultatet af sin kaldet ikke
bliver brugt til noget i loopet er der ikke noget som forhindrer
oversætteren i at smide sin kaldet væk.

Desuden er argumentet til funktionen konstant så oversætteren gider næppe
kalde funktionen mere end een gang.



Troels Thomsen (22-04-2003)
Kommentar
Fra : Troels Thomsen


Dato : 22-04-03 12:50

> Da resultatet af sin kaldet ikke
> bliver brugt til noget i loopet er der ikke noget som forhindrer
> oversætteren i at smide sin kaldet væk.

Men det gør den ikke, jeg har disabled optimeringer

> Desuden er argumentet til funktionen konstant så oversætteren gider næppe
> kalde funktionen mere end een gang.

Men det gør den altså, jeg har disabled optimeringer

(og ja, det tager kortere tid hvis jeg udkommenterer sinus)



Thomas Krog (22-04-2003)
Kommentar
Fra : Thomas Krog


Dato : 22-04-03 19:32

> > Da resultatet af sin kaldet ikke
> > bliver brugt til noget i loopet er der ikke noget som forhindrer
> > oversætteren i at smide sin kaldet væk.
>
> Men det gør den ikke, jeg har disabled optimeringer

fair nok.

Måske skyldes hastighedsforskellen at koden til sinus funktionen ikke ligger
i cachen den første gang.



Jesper Wolf Jesperse~ (25-04-2003)
Kommentar
Fra : Jesper Wolf Jesperse~


Dato : 25-04-03 23:35

> Måske skyldes hastighedsforskellen at koden til sinus funktionen ikke
ligger
> i cachen den første gang.

Det kan også skyldes at de trigonometriske funktioner benytter sig af
datastrukturer, arrays og des lignende som initialiseres første gang man
kalder en trigonometrisk funktion som sin().
Dette ses tit i forbindelse med funktiner til hashing og CRC beregning, om
det også bruges i trigonometri ved jeg ikke men det var da en mulighed.

Med venlig hilsen
Jesper Wolf Jespersen



Gert (21-04-2003)
Kommentar
Fra : Gert


Dato : 21-04-03 13:05

Hej
Til det I skal bruge det til bør I bruge funktionen:
clock( void );
Det er ANSI funktion der fortæller hvor meget procestid jeres proces har
brugt, Så den er ligeglad med om andre processer får processor-tid inden
jeres program er færdigt(multitasking). De andre tager ikke højde for dette
problem.

Gert.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste