From owner-freebsd-performance@FreeBSD.ORG Sun Feb 19 04:06:56 2006 Return-Path: X-Original-To: freebsd-performance@freebsd.org Delivered-To: freebsd-performance@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 292CE16A422 for ; Sun, 19 Feb 2006 04:06:56 +0000 (GMT) (envelope-from mark@gaiahost.coop) Received: from biodiesel.gaiahost.coop (biodiesel.gaiahost.coop [64.95.78.120]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5F64D43D46 for ; Sun, 19 Feb 2006 04:06:55 +0000 (GMT) (envelope-from mark@gaiahost.coop) Received: from gaiahost.coop (host-64-65-195-19.spr.choiceone.net [::ffff:64.65.195.19]) (AUTH: LOGIN mark@hubcapconsulting.com) by biodiesel.gaiahost.coop with esmtp; Sat, 18 Feb 2006 23:06:55 -0500 id 0057807F.43F7EEDF.0000617F Received: by gaiahost.coop (sSMTP sendmail emulation); Sat, 18 Feb 2006 23:06:57 -0500 Date: Sat, 18 Feb 2006 23:06:57 -0500 From: Mark Bucciarelli To: freebsd-performance@freebsd.org Message-ID: <20060219040656.GT2756@rabbit> Mail-Followup-To: freebsd-performance@freebsd.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_biodiesel.gaiahost.coop-24959-1140322015-0001-2" Content-Disposition: inline User-Agent: Mutt/1.4.2.1i Subject: stat speed X-BeenThere: freebsd-performance@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Performance/tuning List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 19 Feb 2006 04:06:56 -0000 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 #include #include #include // $ 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--