SICStus Prolog 4.3.2 マニュアルに示されているように、外部コード サンプルc1/2
Y 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