Performance patch, dir.c:do_reload_dir() on large dirs.



 I had some problems with /tmp/ksocket/* when it contained ~20'000
files, all of the same length thus foiling the strlen() 'optimisation'.

 This small patch tries to skip the check-if-file-was-marked-in-the-
old-list-logic if no files we're marked at all. It considered
decrementing 'marked_cnt' for every found file but I think do_load_dir()
and do_reload_dir() would be better off with a hash table.

 BTW: lxr on gnome is:

  1) not linked from the project page and
  2) not working, try src/dir.c

 Inline against yesterdays snapshot (2001-11-28):

--- dir.c-org   Wed Nov 28 17:18:55 2001
+++ dir.c       Wed Nov 28 17:37:27 2001
@@ -600,10 +600,11 @@ do_reload_dir (dir_list *list, sortfn *s
     DIR           *dirp;
     struct dirent *dp;
     int           next_free = 0;
-    int           i, found, status, link_to_dir, stalled_link;
+    int           i, status, link_to_dir, stalled_link;
     struct stat   buf;
     int                  tmp_len;  /* For optimisation */
     int          dotdot_found = 0;
+    int           marked_cnt;
 
     tree_store_start_check_cwd ();
     dirp = mc_opendir (".");
@@ -614,13 +615,15 @@ do_reload_dir (dir_list *list, sortfn *s
     }
 
     alloc_dir_copy (list->size);
-    for (i = 0; i < count; i++){
+    for (marked_cnt = i = 0; i < count; i++){
        dir_copy.list [i].fnamelen = list->list [i].fnamelen;
        dir_copy.list [i].fname =    list->list [i].fname;
        dir_copy.list [i].f.marked = list->list [i].f.marked;
         dir_copy.list [i].f.dir_size_computed = list->list [i].f.dir_size_computed;
        dir_copy.list [i].f.link_to_dir = list->list [i].f.link_to_dir;
        dir_copy.list [i].f.stalled_link = list->list [i].f.stalled_link;
+       if ( list->list [i].f.marked )
+           marked_cnt++;
     }
 
     for (dp = mc_readdir (dirp); dp; dp = mc_readdir (dirp)){
@@ -644,17 +647,17 @@ do_reload_dir (dir_list *list, sortfn *s
            return next_free;
        }
 
+       list->list [next_free].f.marked = 0;
        tmp_len = NLENGTH (dp);
-       for (found = i = 0; i < count; i++)
+       if ( marked_cnt ) {
+           for (i = 0; i < count; i++) {
            if (tmp_len == dir_copy.list [i].fnamelen
                && !strcmp (dp->d_name, dir_copy.list [i].fname)){
                list->list [next_free].f.marked = dir_copy.list [i].f.marked;
-                found = 1;
                break;
            }
-
-       if (!found)
-           list->list [next_free].f.marked = 0;
+           }
+       }
 
        list->list [next_free].fnamelen = tmp_len;
        list->list [next_free].fname = g_strdup (dp->d_name);


-- 
//Björnen, my 'd' key is flimsy :(

Attachment: pgp7Pxn0SlTdg.pgp
Description: PGP signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]