BProlog 8.1中不均匀的制表性能

rep*_*eat 5 performance prolog memoization b-prolog prolog-tabling

我用版本8.1 的表格功能做了一些实验, 并且对我观察到的性能感到非常惊讶.

这是我使用的代码.它计算将一些正整数减少到以下所需的Collat​​zN数:I1

%:- table posInt_CollatzSteps/2.               % remove comment to enable tabling
posInt_CollatzSteps(I,N) :-
   (  I == 1
   -> N = 0                                                % base case
   ;  1 is I /\ 1 
   -> I0 is I*3+1, posInt_CollatzSteps(I0,N0), N is N0+1   % odd
   ;  I0 is I>>1,  posInt_CollatzSteps(I0,N0), N is N0+1   % even
   ).
Run Code Online (Sandbox Code Playgroud)

要确定从所有整数需要减少最大步数I0I:

i0_i_maxSteps0_maxSteps(I0,I,M0,M) :-
   (  I0 > I
   -> M0 = M
   ;  posInt_CollatzSteps(I0,N0),
      I1 is I0+1,
      M1 is max(M0,N0),
      i0_i_maxSteps0_maxSteps(I1,I,M1,M)
   ).
Run Code Online (Sandbox Code Playgroud)

当我在?- time(i0_i_maxSteps0_maxSteps(1,1000000,0,MaxSteps)).没有表格的情况下运行一些查询时,我观察到以下运行时(以秒为单位):

  • 没有表格:6.784
  • 与建表:2.323,19.78,3.089,3.084,3.081

通过添加:- table posInt_CollatzSteps/2.查询得到快2倍.不过,我很困惑:

  • 第二轮比第一轮慢5倍.显然大多数时间花在GC上.从第3次开始,表格变体再次快速.
  • 暖运(第3,第4,......)明显慢于冷(第1)运行.

我没想到这个!将此与我在版本3.6.0中观察到的运行时间进行对比:

  • 没有表格:14.287
  • 与建表:1.829,0.31,0.308,0.31,0.333

我能做什么?是否有任何指令或标志可以帮助我获得更好的BProlog性能?我在Linux上使用BProlog版本8.1 64位版本.