当我运行foreign code sample c1/2
时,如SICStus Prolog 4.3.2手册所示,并将其运行时与相应的Prolog代码Y is X+9
进行比较,我得到了奇怪的时序结果:
p(N, X) :- ( true1G, X is N+9, false ; X is N+9 ). q(N, X) :- ( true1G, c1(N,X), false ; c1(N,X) ). true10. true10. true10. true10. true10. true10. true10. true10. true10. true10. true1k :- true10, true10, true10. true1M :- true1k, true1k. true1G :- true1M, true1k.
启用JIT后,我观察到:
| ?- call_time(p(11,X), T_p). X = 20, T_p = 17580 ? ; % Prolog code no | ?- call_time(q(11,X), T_q). X = 20, T_q = 66950 ? ; % C code no
关闭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有一个专用的算术函数 popcount/1
,但是
SICStus似乎不支持它(还)......