Date: Sat, 18 Feb 2006 23:06:57 -0500 From: Mark Bucciarelli <mark@gaiahost.coop> To: freebsd-performance@freebsd.org Subject: stat speed Message-ID: <20060219040656.GT2756@rabbit>
next in thread | raw e-mail | index | archive | help
This is a MIME-formatted message. If you see this text it means that your E-mail software does not support MIME-formatted messages. --=_biodiesel.gaiahost.coop-24959-1140322015-0001-2 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline I'm curious how fast stat is. I generated a list of 200,000 file names # find / | head -200000 > files.statspeed then ran a million iterations of randomly picking a file name and stating it (see attached program). The run times were pretty consistent: 187,422 stats/second 189,059 189,567 189,894 Are these numbers a meaningful measure of stat speed on my particular machine? If not, how can I improve the test? m --=_biodiesel.gaiahost.coop-24959-1140322015-0001-2 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="statspeed.c" // statspeed.c // // Mark Bucciarelli // 2006-02-18 // // Read in a long list of file names. // Randomly pick one, stat it, randomly pick another, stat // it, etc. // // Use a big list of files to try and avoid file system caching. // #include <sys/time.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> // $ find / | head 200000 > files.statspeed #define fname "files.statspeed" #define maxfiles 200000 #define maxchars maxfiles * FILENAME_MAX // 1024 on FreeBSD #define statcalln 1000000 #define timeval2double(tv) (double)tv.tv_sec + (double)tv.tv_usec/1000000.0; char space[ maxchars ]; int main( long arvc, char* argv[] ) { struct timeval t1, t2; struct timezone tz; double t1d, t2d; char *files[maxfiles]; FILE *f; gettimeofday(&t1, &tz); // load list of file names f = fopen( fname, "r" ); if ( !f ) { printf( "Couldn't open file '%s'.\n", fname ); return 1; } char *p = space; long charn = 0; long filen = 0; while ( (charn + FILENAME_MAX ) < maxchars && filen < maxfiles && fgets( p, FILENAME_MAX, f ) ) { if ( p[strlen(p)-1] == '\n' ) p[strlen(p)-1]='\0'; charn += strlen( p ); files[filen++] = p; p += strlen(p); } fclose( f ); // msg if too many file names if ( (charn + FILENAME_MAX) >= maxchars ) { printf( "%s has too many characters (%d > %d)\n", fname, charn, maxchars ); return 1; } if ( filen > maxfiles ) { printf( "%s has too many files (%d > %d)\n", fname, filen, maxfiles ); return 1; } gettimeofday(&t2, &tz); t1d = timeval2double( t1 ); t2d = timeval2double( t2 ); printf( "%5.2f seconds for setup\n", t2d - t1d ); // stat files double r; long filei; long i; struct stat sb; gettimeofday(&t1, &tz); for ( i = 0; i < statcalln; i++ ) { r = ( (double) rand()) / ((double) RAND_MAX ); filei = (long) ( r * filen ); stat( files[filei], &sb ); } gettimeofday(&t2, &tz); t1d = timeval2double( t1 ); t2d = timeval2double( t2 ); // output results printf( "%5.2f seconds for %d stat calls\n", t2d - t1d, statcalln ); if ( t2d - t1d > 0 ) printf( "%d calls/second\n", (long) (statcalln / ( t2d - t1d ) ) ); else printf( "Cain't touch this, da da da dum, da DUM, da DUM cain't touch this.\n" ); return 0; } --=_biodiesel.gaiahost.coop-24959-1140322015-0001-2--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060219040656.GT2756>