|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2006
Messaggi: 71
|
[C] Cronometrare tempo di esecuzione di un programma
Esiste un modo di implementare nel codice di un programma un algoritmo/po' di codice che calcoli il tempo di esecuzione dello stesso? Il bisogno nasce dalla mia scimmia nascente per http://projecteuler.net, e dalla necessità (mista anche a curiosità e desiderio di ottimizzazione di codice asd) di sapere quanto tempo impiega il programma che sviluppo per risolvere il quesito a svolgere il suo compito. Idee?
Mi era parso di scorgere una cosa del genere fatta con Python (occhio, spoiler di uno dei problemi del sito), però anche frugando in giro non ho trovato molto per il C... |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sistema operativo ? Risoluzione della misura (secondi, millisecondi, nanosecondi
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Nov 2006
Messaggi: 71
|
Win Xp, e penso che vadano di lusso i decimi di secondo ^^!
Dal blog che ho linkato, Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora ti servono le api di Windows. Il C standard può andare solo fino ai secondi.
http://msdn2.microsoft.com/en-us/library/ms713418.aspx Devi includere windows.h e linkare winmm.lib o libwinmm.a (se hai un compilatore derivato da gcc)... Basta fare una chiamata all'inizio ed una alla fine dell'intervallo che vuoi misurare. Memorizzi il valore ritornato in un unsigned int e poi fai la differenza fra i due valori (fine - inizio) per ottenere i millisecondi trascorsi. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Nov 2006
Messaggi: 71
|
MMh ok, gracias! Provo un po' e al limite ti faccio sapere! Grazie ancora!
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Per Win32 e misurazioni di precisione c'è QueryPerformanceCounter, citato anche nell'MSDN riportata da cionci
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Nov 2006
Messaggi: 71
|
Mmh, non gli piace. Ho implementato tutto bene, fatte le due chiamate, una all'ìinizio e una proprio prima di finire, storate su due diverse variabili che poi vado a sottrarre alla fine. Incuriosito dal fatto che mi desse 0, sono andato a vedere il valore delle variabili. Entrambe danno esattamente 4199472 come valore; ho pensato che fosse a causa del tipo di variabile (unsigned int), ho provato a cambiare in long ma niente, stesso valore. L'unica cosa è che il Dev mi da un warning in fase di compilazione, "assignment makes integer from pointer without a cast". Bho!
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Posta il sorgente (magari non tutto se è lungo, solo le parti dove dichiari le variabili e dove fai le chiamate per ottenere il tempo e poi i calcoli).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#9 |
|
Member
Iscritto dal: Nov 2006
Messaggi: 71
|
Codice:
#include<stdio.h>
#include<math.h>
#include<windows.h>
int isPrime(long int a);
int main(int argc[], char *argv[])
{
long int i, x, primes[10001];
unsigned int time_start, time_end, time;
time_start = timeGetTime;
...
blablabla
...
time_end = timeGetTime;
time = time_end - time_start;
printf("\nStart time: %u.\nEnd time: %u.\nTime Elapsed: %u.\n\n", time_start, time_end, time);
printf("The 10001st prime number is %ld.\n", primes[x-1]);
printf("Press any key to continue.\n");
getch();
return(0);
}
int isPrime(long int a)
{
blablabla
}
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
DWORD timeGetTime(VOID); Quindi: DWORD time_start, time_end, time; time_start = timeGetTime (); ecc...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
timeGetTime(), mancano le parentesi...mettendo solo il nome della funzione in pratica ne usi il puntatore...
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Nov 2006
Messaggi: 71
|
funziona! grazie!
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vabbè...di fatto un DWORD è un unsigned int....
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
A dire il vero è un unsigned long. Cambia nulla come dimensione, lo so .... ma se su MSDN leggo DWORD, io personalmente metto DWORD. Vuoi perché sono fatto così ... vuoi per pura coerenza.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Per carità anche io quando programmo in Win32...ma non gli volevo mettere troppo carne al fuoco
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
ma se uno volesse fare lo stesso senza usare le api di windows?? stò su linux, quindi non posso usarle
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No se vuoi una risoluzione più bassa del secondo.
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
mi vanno bene anche i secondi...come si fa?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
time_t start = time(NULL);
.... time_t end = time(NULL); printf("Tempo trascorso: %d", end - start); |
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
funziona..ti ringrazio
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:58.












funziona!








