+2014-03-26 Bernhard Voelker <mail@bernhard-voelker.de>
+
+ 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 <eggert@cs.ucla.edu>
obstack: Remove ancient NeXTSTEP gcc support conditional
#endif
#include <dirent.h>
-#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. */
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
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