From: Bernhard Voelker Date: Wed, 9 Apr 2014 12:14:08 +0000 (+0200) Subject: fts: avoid unnecessary strlen calls X-Git-Tag: v1.0~7407 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=85dd7d7fd9cdfd004c95287dd55575ba6118bb69;p=gnulib.git fts: avoid unnecessary strlen calls * lib/fts.c (_D_EXACT_NAMLEN): Remove macro. (fts_build): Store the length of the dp->d_name entry in a local variable instead of calling strlen() several times via the above, removed macro. For 'rm -rf some-dir' with e.g. 1M directory entries, this speeds up the run by ~4%, and reduces the execution time by about a third if run via "ltrace -c rm -rf some-dir". --- diff --git a/ChangeLog b/ChangeLog index 0d0ac9e909..0e9a383ab5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2014-03-26 Bernhard Voelker + + fts: avoid unnecessary strlen calls + * lib/fts.c (_D_EXACT_NAMLEN): Remove macro. + (fts_build): Store the length of the dp->d_name entry in a local variable + instead of calling strlen() several times via the above, removed macro. + For 'rm -rf some-dir' with e.g. 1M directory entries, this speeds up the + run by ~4%, yet this reduces the execution time by about a third if run + via "ltrace -c rm -rf some-dir". + 2014-03-27 Paul Eggert obstack: Remove ancient NeXTSTEP gcc support conditional diff --git a/lib/fts.c b/lib/fts.c index bc3c3c12a0..660aeffbd6 100644 --- a/lib/fts.c +++ b/lib/fts.c @@ -79,9 +79,6 @@ static char sccsid[] = "@(#)fts.c 8.6 (Berkeley) 8/14/94"; #endif #include -#ifndef _D_EXACT_NAMLEN -# define _D_EXACT_NAMLEN(dirent) strlen ((dirent)->d_name) -#endif #if HAVE_STRUCT_DIRENT_D_TYPE /* True if the type of the directory entry D is known. */ @@ -1447,19 +1444,20 @@ fts_build (register FTS *sp, int type) nitems = 0; while (cur->fts_dirp) { bool is_dir; + size_t d_namelen; struct dirent *dp = readdir(cur->fts_dirp); if (dp == NULL) break; if (!ISSET(FTS_SEEDOT) && ISDOT(dp->d_name)) continue; - if ((p = fts_alloc (sp, dp->d_name, - _D_EXACT_NAMLEN (dp))) == NULL) + d_namelen = strlen (dp->d_name); + if ((p = fts_alloc (sp, dp->d_name, d_namelen)) == NULL) goto mem1; - if (_D_EXACT_NAMLEN (dp) >= maxlen) { + if (d_namelen >= maxlen) { /* include space for NUL */ oldaddr = sp->fts_path; - if (! fts_palloc(sp, _D_EXACT_NAMLEN (dp) + len + 1)) { + if (! fts_palloc(sp, d_namelen + len + 1)) { /* * No more memory. Save * errno, free up the current structure and the @@ -1483,7 +1481,7 @@ mem1: saved_errno = errno; maxlen = sp->fts_pathlen - len; } - new_len = len + _D_EXACT_NAMLEN (dp); + new_len = len + d_namelen; if (new_len < len) { /* * In the unlikely event that we would end up