]> Repositorios git - scryer-prolog.git/commitdiff
improve ground/1 performance (#1389)
authorMark <[email protected]>
Thu, 13 Jul 2023 00:11:56 +0000 (18:11 -0600)
committerMark <[email protected]>
Thu, 13 Jul 2023 00:11:56 +0000 (18:11 -0600)
src/heap_iter.rs
src/machine/machine_state_impl.rs

index 96aef41d496d357f9d8e19b6fec9b38318edeb89..c20840b7c80ff8c74616b56cf9858259096a7359 100644 (file)
@@ -218,6 +218,11 @@ impl<'a> StackfulPreOrderHeapIter<'a> {
         None
     }
 
+    #[inline]
+    pub fn stack_len(&self) -> usize {
+        self.stack.len()
+    }
+
     fn push_if_unmarked(&mut self, loc: IterStackLoc) {
         let cell = self.read_cell_mut(loc);
 
index 3bb118f96173b920280563f2e9bcb8b105950551..6b08b93ecd7e2876eda740bc4846acd5bea11eee 100644 (file)
@@ -1612,6 +1612,8 @@ impl MachineState {
 
     // returns true on failure.
     pub fn ground_test(&mut self) -> bool {
+        use fxhash::FxBuildHasher;
+
         if self.registers[1].is_constant() {
             return false;
         }
@@ -1622,13 +1624,15 @@ impl MachineState {
             return true;
         }
 
+        let mut visited = IndexSet::with_hasher(FxBuildHasher::default());
         let mut iter = stackful_preorder_iter(&mut self.heap, &mut self.stack, value);
+        let mut stack_len = 0;
 
         while let Some(value) = iter.next() {
-            let value = unmark_cell_bits!(value);
+            let mut value = unmark_cell_bits!(value);
 
             if value.is_var() {
-                let value = heap_bound_store(
+                value = heap_bound_store(
                     iter.heap,
                     heap_bound_deref(iter.heap, value),
                 );
@@ -1637,6 +1641,18 @@ impl MachineState {
                     return true;
                 }
             }
+
+            if value.is_compound(iter.heap) {
+                if visited.contains(&value) {
+                    for _ in stack_len .. iter.stack_len() {
+                        iter.pop_stack();
+                    }
+                } else {
+                    visited.insert(value);
+                }
+            }
+
+            stack_len = iter.stack_len();
         }
 
         false