PDA

Visualizza la versione completa : [C] Trovare il tempo di calcolo di una funzione


thesalien
18-01-2005, 17:52
Ciao a tutti, vorrei trovare il tempo di calcolo di funzione. Ho provato includendo timer.h e usando:
start = clock();
funzione; stop = clock();
durata = (double) (stop-start)/CLK_TCK;
Ma mi da sempre 0.00000
Penso che non riesca a rilevare tempi di calcolo non elevati come quelli che sto cercando di calcolare.
Qualcuno mi puo dare una mano?
(sono su Win e non posso usare gettimeofday come in linux)

minoz
18-01-2005, 20:34
In effetti ho anch'io lo stesso problema.. :master:
Io metto la mia funzione da testare im un ciclo della durata di qualche secondo, così dividendo per il numero di volte ottieni la durata della singola funzione.. :bhò:

minoz
18-01-2005, 20:36
time_t Start;
time_t Stop;

time( &Start );

...
...
...

time( &Stop );

printf("Tempo impiegato %f\n", difftime(Stop, Start));


Io faccio così...

thesalien
19-01-2005, 10:53
ma, intendi come una sorta di media tra i risultati ottenuti?

minoz
19-01-2005, 11:07
Si

thesalien
19-01-2005, 11:13
ora provo a fare come mi hai suggerito, poi ti faccio sapere :ciauz:

thesalien
19-01-2005, 11:22
Mi dice sempre che impiega 0.00000.... ti pasto il codice, ma penso che questo fatto dipenda dalla difficoltà del pc a misurare tempi di calcolo esigui come in questo caso e che quindi sia un problema irrisolvibile :(



#include <stdio.h>
#include <time.h>
int espr(int a,int n);

main(){
int a; /*base*/
int n; /*esponente*/
int r; /*elemento sul quale eseguire l'operazione di modulo*/
int risultato; /*risultato dell'espressione*/
clock_t start, stop;
double durata;








printf("\nInserire a (base):");
scanf("%d",&a);
printf("\nInserire n (esponente):");
scanf("%d",&n);
printf("\ndammi r (elemento sul quale eseguire l'operazione di modulo):");
scanf("%d",&r);

time( &start );




if(a==r) risultato = 0;
else risultato = espr(a, n) % r;

time( &stop );


printf("\n il risultato dell'espressione: %d elevato %d e': %d ",a,n,risultato);

printf("\n tempo di calcolo : %f",difftime(stop, start));
getchar ();
getchar ();
fflush (stdin);
}


int espr(int a, int n)
{
if (n==0) return 1; //caso base:
return a*espr(a,(n-1)); //passo induttivo:
}

Nov@lis
19-01-2005, 12:16
Sul forum trovate la risposta ai vostri problemi... ma sono buono e vi posto il codice :madai!?:



#ifdef _WIN32
#include <windows.h>

static LARGE_INTEGER _tstart, _tend;
static LARGE_INTEGER freq;

void tstart(void){
static int first = 1;

if(first){
QueryPerformanceFrequency(&freq);
first = 0;
}

QueryPerformanceCounter(&_tstart);
}

void tend(void){
QueryPerformanceCounter(&_tend);
}

double tval(){
return ((double)_tend.QuadPart - (double)_tstart.QuadPart)/((double)freq.QuadPart);
}
#else
#include <sys/time.h>

static struct timeval _tstart, _tend;
static struct timezone tz;

void tstart(void){
gettimeofday(&_tstart, &tz);
}

void tend(void){
gettimeofday(&_tend,&tz);
}

double tval(){
typedef signed long s;
s t1, t2;
t1 = (s)_tstart.tv_sec + (s)_tstart.tv_usec/(1000*1000);
t2 = (s)_tend.tv_sec + (s)_tend.tv_usec/(1000*1000);
return t2-t1;
}
#endif


prima di far partire la porzione di codice da cronometrare chiamate

tstart();

quando dovete fermare il tempo chiamate

tend();

e subito dopo

double tempo=tval()

thesalien
19-01-2005, 12:44
Ciao Nov@lis, grazie per aver preso parte alla discussione.. ora funziona! :yuppi:
Grazie mille, ti posso chiedere se conosci qualche sito (possibilmente in italiano) per approffondire questo argomento. Avrei intenzione di capire quello che ho scritto perchè non mi è mai andato di giù di scrivere cose di cui non so assolutamente nulla :bhò:

Avevo letto anch'io da qualche parte di questo gettimeofday ma pensavo che esistesse solo per linux (o almeno, non sapevo che libreria includere in win )..

Nov@lis
19-01-2005, 13:18
teoricamente questo codice funziona sia su windows che su linux.

Su Windows si utilizzano le funzioni della libreria windows.h


#ifdef _WIN32
#include <windows.h>


mentre su Linux si usa time.h


#else
#include <sys/time.h>

Loading