問題タブ [b-prolog]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - BProlog 8.1 での不均一なテーブル パフォーマンス
私はb-prologバージョン 8.1のテーブル機能でいくつかの実験を行い、 観察したパフォーマンスに非常に驚きました。
これが私が使用したコードです。正の整数を に減らすために必要なコラッツステップの数をカウントします。N
I
1
から までのすべての整数に必要なリダクション ステップの最大数を決定するには、次のI0
ようにしI
ます。
テーブルを使用しない場合と使用する場合のいくつかのクエリ?- 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 ビット版を使用しています。
list - 制約を使用して変数の 2 つのリストを辞書式に並べ替える
CLP(FD) を使用して、BProlog で辞書式順序制約を実装しようとしています。
マニュアルからわかる限り、BProlog は組み込みのlexLeq
制約を提供していません (ただし、このグローバルな制約には効率的な伝播アルゴリズムが存在します)。バイナリ制約:
制約を表現するには、 s(A1 #/\ A2 #/\ ... #/\ AN) => AN+1
を具体化できるはずだと思うので、次のようにします。Ai
次に、s を収集B
し、接続詞が有効であることを確認するには、次のようにします。
このアイデアは、次の (おそらく非常に醜い) コードにつながります。
これは部分的に機能します:
生成されたすべてのソリューションが制約を満たしていることがわかります。問題は、すべての有効なソリューションが生成されるとは限らないことです。私が説明した制約は、それX1 #>= X2 #>= ... #>= XN
またはそのようなものを何らかの形で暗示しているように見えるため、すべての変数は または のいずれ0
かですが、上記のクエリはvsまたはvsなど1
のソリューションも返す必要があります。[0,1,0]
[0,1,0]
[0,0,0]
[0,1,0]
それで、私の推論に何か問題がありますか、それとも上記の定義にバグがありますか?