prolog - SICStus 序言 : statistics/2 values affected by JIT

标签 prolog benchmarking sicstus-prolog

更新: 据@PerMildner 报道,以下问题(SICStus Prolog 4.3 中存在。2)已在新的 SICStus Prolog 4.3 中消失。3 ! 干得好!


我正在使用 SICStus Prolog 4.3.2,并且我 了解一些 statistics/2 我以前没有使用过的键...这是我的代码:

:- use_module(library(lists)).

a_is_b_minus_c(A,B,C) :-
   A is B-C.

call_keys_deltas(Goal_0, Keys, Deltas) :-
   maplist(statistics, Keys, Values0),
   call(Goal_0),
   maplist(statistics, Keys, Values1),
   maplist(a_is_b_minus_c, Deltas, Values1, Values0).

call_keys_deltas/3 收集有关谓词执行的一些信息,例如:

boolsA([]).                        
boolsA([0|Bs]) :- boolsA(Bs).
boolsA([1|Bs]) :- boolsA(Bs).

%%

bool(0).
bool(1).

boolsB([]).
boolsB([B|Bs]) :- bool(B), boolsB(Bs).

我期望 ?- boolsA([0,0]). 有两个选择点,但 ?- boolsB([0,0]) 没有。

JIT 运行后立即获得的数字与完成后获得的数字不同:

  • 使用 JIT

    $ export SP_JIT=enabled && sicstus
    % ...
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds).
    Ds = [112,904] ? ;
    no
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds).
    Ds = [112,16] ? ;
    no
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds).
    Ds = [0,1264] ? ;
    no
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds).
    Ds = [0,8] ? ;
    no
    
  • 没有 JIT

    $ export SP_JIT=disabled && sicstus
    % ...
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds).
    Ds = [112,16] ? ;
    no
    | ?- call_keys_deltas(boolsA([0,0]), [choice_used,trail_used], Ds).
    Ds = [112,16] ? ;
    no
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds).
    Ds = [0,8] ? ;
    no
    | ?- call_keys_deltas(boolsB([0,0]), [choice_used,trail_used], Ds).
    Ds = [0,8] ? ;
    no
    

我想知道上述差异是否是故意的......感谢您的帮助!

最佳答案

这种差异不是故意的。它应该在最新版本的 SICStus Prolog (4.3.3) 中消失。

请注意,即使在 SICStus 4.3.3 之前,choice_used 也没有什么不同,并且您可能应该使用该统计数据来“量化不确定性”。

关于prolog - SICStus 序言 : statistics/2 values affected by JIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37378571/

相关文章:

C# 7.2 在关键字性能方面

prolog - 如何使用clpfd :automaton to restrict counter value in SICStus Prolog?

prolog - 将 goal_expansion/6 限制为仅编译时间

prolog - 卡住/2 的意外行为

serialization - 相当于 SWI Prolog 中的 Python 酸洗?

序言常数

linux - 在 Linux 中测试 IO 性能

PROLOG 一个特定的有限状态自动机

prolog - 在单独的行中打印矩阵

performance - 什么是 FLOP/s?它是衡量性能的一个很好的指标吗?