/* compile with cc -Wall ccOpen.c cycle_counter.c -o ccOpen try also adding some optimization cc -Wall -O0 ccOpen.c cycle_counter.c -o ccOpen cc -Wall -O1 ccOpen.c cycle_counter.c -o ccOpen ... until -O3 (maybe the realcc doesn't work for some optimization level). */ #include "cycle_counter.h" #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> /* resources not allocated yet */ int fd = -1; long *time_open = NULL, *time_close = NULL; /* use cat /proc/cpuinfo to determine the MHz */ #define MHz 1210.804260 void myexit(int ret); CPU_clock_num guess_realcc_overhead(void); int main(int argc,char *argv[]) { char string[256]; int nprove,i,cc; CPU_clock_num before,after,cc_oh; if (argc != 3) { printf("Uso: %s <numero di prove> <nome del file>\n",argv[0]); myexit(5); } if (sscanf(argv[1],"%d",&nprove) != 1 || nprove <= 0) { printf("%s non va bene come <numero di prove>\n",argv[1]); myexit(5); } if ( (time_open = malloc( nprove * sizeof(long) )) == NULL ) { sprintf(string,"Errore allocando %d bytes per time_open",nprove * sizeof(long)); perror(string); myexit(5); } if ( (time_close = malloc( nprove * sizeof(long) )) == NULL ) { sprintf(string,"Errore allocando %d bytes per time_close",nprove * sizeof(long)); perror(string); myexit(5); } cc_oh = guess_realcc_overhead(); printf("1sec cicli clock %6ld == %12.6f microsecs\n",(long)(after-before),((long)(after-before))/MHz); for ( i = 0 ; i < nprove ; i++) { before = realcc(); fd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC , 00644); after = realcc(); time_open[i] = after-before-cc_oh; if ( fd == -1 ) { sprintf(string,"Apertura di %1.200s fallita",argv[2]); perror(string); myexit(5); } before = realcc(); cc = close(fd); after = realcc(); time_close[i] = after-before-cc_oh; if ( cc == -1 ) { sprintf(string,"Chiusura di %1.200s fallita",argv[2]); perror(string); myexit(5); } } for ( i = 0 ; i < nprove ; i++) { printf("%4d cicli clock open %6ld == %12.6f microsecs ",i,time_open[i],time_open[i]/MHz); printf("cicli clock close %6ld == %12.6f microsecs\n",time_close[i],time_close[i]/MHz); } myexit(0); } void myexit(int ret) { /* free the (eventually) allocated resources */ if (time_open != 0) free(time_open); if (time_close != 0) free(time_close); exit(ret); } CPU_clock_num guess_realcc_overhead(void) { register int i; CPU_clock_num before,after,delta,sum; int cnt; sum = cnt = 0L; /* cache clock code */ before = realcc(); after = realcc(); delta = after-before; for (i = 0 ; i < 20 ; ++i ) { before = realcc(); after = realcc(); delta = after-before; if (delta < 100) { sum += delta; cnt++; } } if (!cnt) /* horrible special case */ return 20L; else return sum/cnt; }-- AntonioValletta - 23 Nov 2001
![]() |
![]() |
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica ![]() |
|
![]() |
![]() |