当我运行外部代码示例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