1

当我运行外部代码示例c1/2时,如 SICStus Prolog 4.3.2 手册中所示,并将其运行时与相应的 Prolog 代码进行比较Y is X+9,我得到了奇怪的计时结果:

p(N, X) :- ( true1G, X 是 N+9, false ; X 是 N+9 )。

q(N, X) :- (true1G, c1(N,X), false ; c1(N,X))。

真的10。真的10。真的10。真的10。真的10。真的10。真的10。真的10。真的10。真的10。

true1k :- true10,true10,true10。

true1M :- true1k,true1k。

true1G :- true1M,true1k。

启用 JIT 后,我观察到:

| ?- call_time (p(11,X), T_p)。
X = 20, T_p = 17580 ? ; % 序言代码
不
| ?- call_time(q(11,X), T_q)。
X = 20, T_q = 66950 ? ; %C 代码
不

关闭 JIT ( SP_JIT=disabled) 后,时序变化如下:

| ?- call_time(p(11,X), T_p).
X = 20, T_p = 19650 ? ;                     % Prolog code
no
| ?- call_time(q(11,X), T_q).               
X = 20, T_q = 55840 ? ;                     % C code
no

即使没有适当的错误处理和对大整数的支持,C 代码的运行时间几乎是 JITted Prolog 代码的 4 倍。关闭 JIT 会稍微改变计时数字,但总体情况保持不变。

如何加快 SICStus 中的汉明权重计算?SWI 有一个专用的算术函数,但 SICStus 似乎不支持它(还)...... popcount/1

4

0 回答 0