SICStus Prolog:FFI慢,如何快速计算汉明重量?

时间:2016-02-21 06:27:38

标签: prolog ffi hamming-distance sicstus-prolog hammingweight

当我运行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似乎不支持它(还)......

0 个答案:

没有答案