3

完了するまでに数秒かかる可能性のある (SWI-) Prolog プログラムのベンチマークを実行しようとしています。CPU 時間とメモリの統計を経時的に保存して、一種の進化プロットを表示できるようにしたいと考えています。システムモニターに似たものですが、私のプログラムだけです。

そのために私は使ってみましたalarm/4

stat_start(Id) :-
    alarm(0.25,stat_point,Id,[remove(false),install(true)]). % 250 milliseconds

stat_stop(Id) :-
    remove_alarm(Id).

stat_point :-
    stat_cpu, % calls statistics/2 and appends values to a CSV file
    stat_mem. % calls statistics/2 and appends values to a CSV file

それぞれの間で適切なタイミングを取得できませんstat_point。タイミングはミリ秒から秒単位で変化し、私はそれについて何もできません。の時間を変更しalarm/4ても違いはありません。次のような簡単なクエリも試しました。

?- alarm(1, write('hello\n'), Id, [remove(false),install(true)]),
   repeat,
   fail.

そして、それも機能しません。「こんにちは」の一言だけです。コード内に への呼び出しを挿入することで解決できるのではないかと考えましたが、stat_point見た目がエレガントではありませんか? さらに、ポイントは等間隔ではありません。

Prolog プログラムを定期的に監視する適切な方法はありますか? どういうわけかprofile/1この種の情報を提供しますか?

4

2 に答える 2

2

述語を定期的に起動するように、または少なくとも自動的に起動するようにアラームを構成することはできないという結論に達しました。のオプションの 1 つに がありますalarm/4が、タイム カウンターを再起動するにはとremove(false)を呼び出す必要があります。これを行わず、 を呼び出さないと、リソース リークが発生します。これはおそらく何らかの形で保護され、最終的に実際のタイマーが停止する可能性があります。uninstall_alarm/1install_alarm/1remove_alarm/1

stat_mem/0これは、述語andへの定期的な呼び出しを使用する適切な方法stat_cpu/0です。

stat_start(Id,T) :-
    alarm(T,stat_point(Id,T),Id,[remove(false),install(true)]).

stat_point(Id,T) :-
    uninstall_alarm(Id),
    install_alarm(Id,T),
    stat_mem, 
    stat_cpu.

この場合、 のinstall_alarm/2代わりに への呼び出しが必要であることに注意してください/1。そうしないと、時間が 0 に設定され、アラームは継続的に述語を起動します。

さて、私の最初の質問の「決定論」の問題に関連して、stat_point私の時間と(可能性は低いですが)メモリの測定値に不確実性を挿入しますが、この不確実性は最終的にstatistics/2述語によって決定されると言えます。CPU 時間はこの呼び出しの影響を受けるため、magusによって提案された解決策 ( 「一次標準」サンプルを使用して測定値のオフセットを見つける) は、この不確実性を減らすためのアプローチである可能性があります。

実際、使用されたメモリと実行時間は、繰り返し呼び出しによって生成されたものよりもはるかに長いためstatistics/2、測定値の精度は「比較的」小さいです。

于 2014-02-15T13:22:28.977 に答える
1

具体的な答えはありませんが、根本的な問題の原因となっている OS である可能性があるため、使用しているオペレーティング システムを記載する価値があるかもしれません (Windows でしょうか?)。

あなたがしているのはメモリとCPUの測定だけであり、測定でprologの内部を調べる必要がまったくない場合(そのように聞こえます)、おそらくOSで行うのが最善です. Linux では、sleep コマンドでループを使用するシェル スクリプトを使用します。

OSとプロローグの干渉がまったくないため、正確である可能性が高くなります-プロローグ/ OSが相互にやり取りしてCPU /メモリ統計を取得するためのタイミングの問題、または統計ポイントによるcpu/memory プロローグの使用に実際に影響を与える述語であり、結果に色を付ける場合があります。

次に、プロローグ/プログラムを「コントロール」として実行せずにスクリプトを実行し、次にプロローグを使用してスクリプトを実行し、違いをプロローグ/プログラムの影響と見なすことができます。あまり科学的/正確ではありませんが、前進する方法かもしれません.

于 2014-02-13T11:10:20.287 に答える