PDA

View Full Version : funzione CRONOMETRO in C#


autista
16-05-2007, 15:41
salve ragazzi, devo cronometrare il tempo di esecuzione di questo programma per analizzarne la complessità, solo che con le spiegazioni riguardo la funzione CLOCK_T trovate in rete non ci sono riuscito


#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define MAX 10

clock_t clock(void) {
clock_t start, end;
double millisec;
time_t app;
start = clock();
end = clock();
millisec = (end-start)/(CLOCKS_PER_SEC /(double) 1000.0);
printf(clock());
return clock();
}

/*
* Legge in input il numero n ed n numeri interi
* che memorizza nell'array. Restituisce il numero
* di elementi letti (n).
*/

int leggi_array(int x[]) {
int i, n;

x[MAX]=rand();

return(MAX);
}


/*
* Stampa in output l'array.
*/

void stampa_array(int x[], int n) {
int i;

for (i=0; i<n; i++) {
printf("%d ", x[i]);
}
printf("\n");
return;
}


/*
* Scambia il contanuto delle due variabili
* indirizzate dai puntatori x e y.
*/

void scambia(int *x, int *y) {
int z;

z = *x;
*x = *y;
*y = z;
return;
}


/*
* Funzione che implementa l'algoritmo Bubble sort.
* Riceve come argomento l'array ed il numero di
* elementi contenuti nell'array. Non restituisce alcun
* valore, ma modifica il contenuto dell'array, ordinandolo.
*/

void bubble_sort(int x[], int n) {
int flag=1, k=n-1, i;

while (flag == 1 && k > 0) {
flag = 0;
for (i=0; i<k; i++) {
if (x[i]>x[i+1]) {
scambia(&x[i], &x[i+1]);
flag = 1;
}
}
k = k-1;
}
return;
}


/*
* Funzione principale
*/

int main(void) {
int v[MAX], n,m,u;

n = leggi_array(v);
stampa_array(v, n);
printf("premere un tasto per iniziare\n");
scanf("%d", &m);



bubble_sort(v, n);

clock_t(bubble_sort);

printf("ordinamento effettuato\n");
return(1);
}

andbin
16-05-2007, 15:52
salve ragazzi, devo cronometrare il tempo di esecuzione di questo programma per analizzarne la complessità, solo che con le spiegazioni riguardo la funzione CLOCK_T trovate in rete non ci sono riuscitoNon è ben chiaro cosa non hai capito ...

Il tipo di dato clock_t e la funzione clock() si usano per esempio così:
clock_t start, end;
double duration;

start = clock ();

/*... tue operazioni da cronometrare ...*/

end = clock ();

duration = (double)(end-start) / CLOCKS_PER_SEC;Dove duration è in secondi.

autista
16-05-2007, 16:00
Non è ben chiaro cosa non hai capito ...

Il tipo di dato clock_t e la funzione clock() si usano per esempio così:
clock_t start, end;
double duration;

start = clock ();

/*... tue operazioni da cronometrare ...*/

end = clock ();

duration = (double)(end-start) / CLOCKS_PER_SEC;Dove duration è in secondi.

allora io devo cronometrare il tempo impiegato per ordinare dal più piccolo al più grande un array col metoto bubble_sort e non ho capito come si usa la funzione clock,
ora è un po' più chiaro con la tua spiegazione, ma poi come faccio a far stampare a video la durata?

andbin
16-05-2007, 17:15
allora io devo cronometrare il tempo impiegato per ordinare dal più piccolo al più grande un array col metoto bubble_sort e non ho capito come si usa la funzione clock.C'è poco da capire, la documentazione su Linux dice ad esempio: "The clock() function returns an approximation of processor time used by the program."
Quindi clock() ritorna un valore che è proporzionale al tempo usato dal processo. Se mettessi un clock() all'inizio del programma (all'inizio del main, ad esempio), otterrei 0. Man mano si incrementa.

ora è un po' più chiaro con la tua spiegazione, ma poi come faccio a far stampare a video la durata?Beh, io ho usato un double tanto per fare un esempio. Per stamparlo:

printf ("%.3f secondi\n", duration);

autista
16-05-2007, 19:42
C'è poco da capire, la documentazione su Linux dice ad esempio: "The clock() function returns an approximation of processor time used by the program."
Quindi clock() ritorna un valore che è proporzionale al tempo usato dal processo. Se mettessi un clock() all'inizio del programma (all'inizio del main, ad esempio), otterrei 0. Man mano si incrementa.

Beh, io ho usato un double tanto per fare un esempio. Per stamparlo:

printf ("%.3f secondi\n", duration);

grazie, sentite per ampliare la dimensione dell' array cosi mi consigliate di usare invece? un long long double?

andbin
16-05-2007, 19:56
per ampliare la dimensione dell' array cosi mi consigliate di usare invece? un long long double?long double? Spiega meglio. Intendi dire poter gestire un array espandibile? Devi usare l'allocazione dinamica: malloc/realloc/free.

autista
16-05-2007, 20:07
long double? Spiega meglio. Intendi dire poter gestire un array espandibile? Devi usare l'allocazione dinamica: malloc/realloc/free.

no voglio solo poter inserire più di 100.000 elementi nell' array

se metto int oltre tale numero non me lo gestisce

andbin
16-05-2007, 20:14
no voglio solo poter inserire più di 100.000 elementi nell' array

se metto int oltre tale numero non me lo gestisceDipende da dove dichiari l'array! Se lo dichiari (senza marcarlo 'static') dentro una funzione, allora è allocato sullo stack. Ma attenzione, non è che puoi avere tutto lo spazio che vuoi nello stack! Sui sistemi Windows lo stack per default è limitato a 1 MByte (ma è una impostazione marcata nell'eseguibile dal linker, quindi alterabile).
Quindi fai un po' tu dei conti ....

Altrimenti definisci l'array fuori dalle funzioni oppure dentro una funzione ma marcato 'static'. Insomma... deve avere durata fissa e non automatica.

autista
16-05-2007, 20:22
guarda l' ho impostato all' inizio del programma che ho allegato, però mi sa hai ragione c'è il problema dello stack

andbin
16-05-2007, 20:29
guarda l' ho impostato all' inizio del programma che ho allegato, però mi sa hai ragione c'è il problema dello stackint main(void) {
int v[MAX], n,m,u;È dichiarato dentro il main, quindi è sullo stack.

autista
16-05-2007, 20:33
int main(void) {
int v[MAX], n,m,u;È dichiarato dentro il main, quindi è sullo stack.

quindi come risolvo?

andbin
16-05-2007, 20:54
quindi come risolvo?O lo lasci dove è ma lo dichiari 'static' oppure lo metti fuori dalle funzioni.