From: Mark Date: Thu, 13 Jul 2023 00:11:56 +0000 (-0600) Subject: improve ground/1 performance (#1389) X-Git-Tag: v0.9.2~62 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=cfc49243c8451e3f120a9b593ca81c56bdbcf34d;p=scryer-prolog.git improve ground/1 performance (#1389) --- diff --git a/src/heap_iter.rs b/src/heap_iter.rs index 96aef41d..c20840b7 100644 --- a/src/heap_iter.rs +++ b/src/heap_iter.rs @@ -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); diff --git a/src/machine/machine_state_impl.rs b/src/machine/machine_state_impl.rs index 3bb118f9..6b08b93e 100644 --- a/src/machine/machine_state_impl.rs +++ b/src/machine/machine_state_impl.rs @@ -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