1

SICStus Prolog 4.3.2 マニュアルに示されているように、外部コード サンプルc1/2Y is X+9を実行し、そのランタイムを対応する Prolog コードと比較すると、奇妙なタイミング結果が得られました。

p(N, X) :- ( true1G、X は N+9、false ; X は 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 ? ; % プロローグ コード
番号
| | ?- 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