私はb-prologバージョン 8.1のテーブル機能でいくつかの実験を行い、 観察したパフォーマンスに非常に驚きました。
これが私が使用したコードです。正の整数を に減らすために必要なコラッツステップの数をカウントします。N
I
1
%:- table posInt_CollatzSteps/2. % remove comment to enable tabling
posInt_CollatzSteps(I,N) :-
( I == 1
-> N = 0 % base case
; 1 is I /\ 1
-> I0 is I*3+1, posInt_CollatzSteps(I0,N0), N is N0+1 % odd
; I0 is I>>1, posInt_CollatzSteps(I0,N0), N is N0+1 % even
).
から までのすべての整数に必要なリダクション ステップの最大数を決定するには、次のI0
ようにしI
ます。
i0_i_maxSteps0_maxSteps(I0,I,M0,M) :-
( I0 > I
-> M0 = M
; posInt_CollatzSteps(I0,N0),
I1 is I0+1,
M1 is max(M0,N0),
i0_i_maxSteps0_maxSteps(I1,I,M1,M)
).
テーブルを使用しない場合と使用する場合のいくつかのクエリ?- time(i0_i_maxSteps0_maxSteps(1,1000000,0,MaxSteps)).
を実行すると、次のランタイム (秒) が観察されました。
- テーブルなし: 6.784
- テーブル付き: 2.323、19.78、3.089、3.084、3.081 _ _ _ _
クエリを追加すること:- table posInt_CollatzSteps/2.
で、2 倍速くなりました。それでも、私は困惑しています:
- 2 回目の実行は、1 回目の実行よりも 5 倍以上遅くなります。どうやらほとんどの時間はGCに費やされています。3 回目以降、テーブル バリアントは再び高速になります。
- ウォーム実行 (3 回目、4 回目、...) は、コールド (1 回目) 実行よりも著しく遅くなります。
私はこれを期待していませんでした!これを、 xsbバージョン 3.6.0で観察したランタイムと比較してください。
- テーブルなし: 14.287
- テーブル付き: 1.829、0.31、0.308、0.31、0.333 _ _ _ _
私に何ができる?BProlog のパフォーマンスを向上させるためのディレクティブやフラグはありますか? Linux で BProlog バージョン 8.1 64 ビット版を使用しています。