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