]> Savannah Git Hosting - gnulib.git/commitdiff
fts: avoid unnecessary strlen calls
authorBernhard Voelker <mail@bernhard-voelker.de>
Wed, 9 Apr 2014 12:14:08 +0000 (14:14 +0200)
committerPádraig Brady <P@draigBrady.com>
Wed, 9 Apr 2014 14:24:37 +0000 (15:24 +0100)
* 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".

ChangeLog
lib/fts.c

index 0d0ac9e90903dd85c41989cf225c3ed3d1959262..0e9a383ab552111a268ec833ed5f50e8ac79f56e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+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
index bc3c3c12a028b3e90c60f03e3febbedf79b4c4e0..660aeffbd662234d908b9c7a8b144a0b4f01b099 100644 (file)
--- 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 <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.  */
@@ -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