bug-grep
[Top][All Lists]
Advanced

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

src/kwset.c (kwsprep): Avoid copying altogether when kwset->trans is NUL


From: Charles Levert
Subject: src/kwset.c (kwsprep): Avoid copying altogether when kwset->trans is NULL
Date: Mon, 4 Jul 2005 12:12:06 -0400
User-agent: Mutt/1.4.1i

Proposed patch; I'll write a ChangeLog entry if
it's accepted.

By defining delta and next as pointers to
arrays, we can avoid copying by not having an
intermediate array when kwset->trans is NULL.

There may be a downside in using a variable
pointer instead of an array name (which is
equivalent to a constant pointer) when first
writing to the region to which it points.
I haven't benchmarked to check, and I wouldn't
have access to a variety of architectures on
which to do so anyway.

What do you think?



--- src/kwset.c 2005-07-04 01:14:37 -0400
+++ src/kwset.c 2005-07-04 09:39:09 -0400
@@ -383,6 +383,6 @@ kwsprep (kwset_t kws)
   register int i;
   register struct trie *curr;
   register char const *trans;
-  unsigned char delta[NCHAR];
+  unsigned char our_delta[NCHAR], *delta;
 
   kwset = (struct kwset *) kws;
@@ -390,6 +390,7 @@ kwsprep (kwset_t kws)
   /* Initial values for the delta table; will be changed later.  The
      delta entry for a given character is the smallest depth of any
      node at which an outgoing edge is labeled by that character. */
+  delta = kwset->trans ? our_delta : kwset->delta;
   memset(delta, kwset->mind < UCHAR_MAX ? kwset->mind : UCHAR_MAX, NCHAR);
 
   /* Check if we can use the simple boyer-moore algorithm, instead
@@ -419,7 +420,7 @@ kwsprep (kwset_t kws)
   else
     {
       register struct trie *fail;
-      struct trie *last, *next[NCHAR];
+      struct trie *last, *our_next[NCHAR], **next;
 
       /* Traverse the nodes of the trie in level order, simultaneously
         computing the delta table, failure function, and shift function. */
@@ -468,23 +469,20 @@ kwsprep (kwset_t kws)
 
       /* Create a vector, indexed by character code, of the outgoing links
         from the root node. */
+      next = kwset->trans ? our_next : kwset->next;
       for (i = 0; i < NCHAR; ++i)
        next[i] = NULL;
       treenext(kwset->trie->links, next);
 
       if ((trans = kwset->trans) != NULL)
        for (i = 0; i < NCHAR; ++i)
-         kwset->next[i] = next[U(trans[i])];
-      else
-       memcpy(kwset->next, next, NCHAR * sizeof(struct trie *));
+         kwset->next[i] = our_next[U(trans[i])];
     }
 
   /* Fix things up for any translation table. */
   if ((trans = kwset->trans) != NULL)
     for (i = 0; i < NCHAR; ++i)
-      kwset->delta[i] = delta[U(trans[i])];
-  else
-    memcpy(kwset->delta, delta, NCHAR);
+      kwset->delta[i] = our_delta[U(trans[i])];
 
   return NULL;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]