From ee08c4affdb85b98759db6bc8834b21b37083dc7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Thu, 12 Nov 1998 03:22:07 +0100
Subject: [PATCH] Optimized the state queue some more. Compiling language.yacc
 has now gone from ~300 to ~110 seconds. Still needs more optimizations
 though.

Rev: lib/modules/LR.pmod/parser.pike:1.5
---
 lib/modules/LR.pmod/parser.pike | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/lib/modules/LR.pmod/parser.pike b/lib/modules/LR.pmod/parser.pike
index 36f95e0ffe..1a43289138 100644
--- a/lib/modules/LR.pmod/parser.pike
+++ b/lib/modules/LR.pmod/parser.pike
@@ -1,5 +1,5 @@
 /*
- * $Id: parser.pike,v 1.4 1998/11/12 01:30:43 grubba Exp $
+ * $Id: parser.pike,v 1.5 1998/11/12 02:22:07 grubba Exp $
  *
  * A BNF-grammar in Pike.
  * Compiles to a LALR(1) state-machine.
@@ -9,7 +9,7 @@
 
 //.
 //. File:	parser.pike
-//. RCSID:	$Id: parser.pike,v 1.4 1998/11/12 01:30:43 grubba Exp $
+//. RCSID:	$Id: parser.pike,v 1.5 1998/11/12 02:22:07 grubba Exp $
 //. Author:	Henrik Grubbstr�m (grubba@infovav.se)
 //.
 //. Synopsis:	LALR(1) parser and compiler.
@@ -73,6 +73,10 @@ class state_queue {
   //. The queue/set itself.
   array(object(LR.kernel)) arr=allocate(64);
 
+  //. + members
+  //.   Hashes of the states that are members.
+  mapping(string:int) members = ([]);
+
   //. - memberp
   //.   Returns the index of the state in arr if present.
   //.   Returns -1 on failure.
@@ -80,14 +84,13 @@ class state_queue {
   //.   State to search for.
   int|object(LR.kernel) memberp(object(LR.kernel) state)
   {
-    int j;
-
-    for (j = 0; j<tail; j++) {
-      if (state->equalp(arr[j])) {
-	return(j);
-      }
+    if (!state->kernel_hash) {
+      state->make_kernel_hash();
+    }
+    if (zero_type(members[state->kernel_hash])) {
+      return(-1);
     }
-    return(-1);
+    return(members[state->kernel_hash]);
   }
 
   //. - push_if_new
@@ -104,6 +107,7 @@ class state_queue {
       if (tail == sizeof(arr)) {
 	arr += allocate(tail);
       }
+      members[state->kernel_hash] = tail;
       arr[tail++] = state;
 
       return(state);
-- 
GitLab