【问题标题】:How can I periodically call statistics/2 in SWI-Prolog?如何在 SWI-Prolog 中定期调用 statistics/2?
【发布时间】:2014-02-11 19:44:44
【问题描述】:

我正在尝试对可能需要几秒钟才能完成的 (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 会以某种方式提供这种信息吗?

【问题讨论】:

  • 我会说,使用警报时,您的测量结果会出现很多不确定性。很难说你实际上应该做什么,但最好测量一些定义明确的部分-

标签: timer prolog swi-prolog periodic-task


【解决方案1】:

我得出的结论是,不能将警报配置为定期触发谓词,或者至少不能自动触发。尽管alarm/4 中的选项之一是remove(false),但必须调用uninstall_alarm/1install_alarm/1 才能重新启动计时器。不这样做并且不调用remove_alarm/1,将产生资源泄漏,这可能会以某种方式受到保护并最终可能会停止实际的计时器。

这将是使用定期调用谓词stat_mem/0stat_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 为我的时间和(不太可能)内存测量插入了不确定性,但这种不确定性最终由@987654332 决定@谓词。由于 CPU 时间受到此调用的影响,ma​​gus 建议的解决方案——使用“主要标准”样本来找到我的测量值的偏移量——可能是减少这种不确定性的一种方法。

事实上,由于使用的内存和执行时间已经远远大于重复调用 statistics/2 所产生的时间,因此我的测量精度“相对”较小。

【讨论】:

  • 至少在 20 年 9 月和 macOS 上,SWI Prolog 似乎已经消除了与此相关的任何错误,因为它在没有补充 unistall_alarm(...), install_alarm(...) 块的情况下对我来说可靠地工作。
【解决方案2】:

我没有具体的答案,但可能值得说明您使用的是哪个操作系统,因为它可能是操作系统。这是根本问题的根源(Windows 有机会吗?)。

如果您所做的只是测量内存和 cpu,并且测量根本不需要询问 prolog 的内部(听起来是这样),那么最好在操作系统中完成。例如。在 linux 中使用带有 sleep 命令的循环的 shell 脚本。

它更可能是准确的,因为您没有操作系统的干扰。以任何方式使用 prolog - 要么是时间问题,因为 prolog/os 相互交互以获取 cpu/内存统计信息,要么是通过您的统计点谓词实际影响 cpu/内存 prolog 的使用,这可能会影响您的结果。

然后您可以在没有 prolog/您的程序作为“控件”运行的情况下运行脚本,然后再次使用 prolog,并将差异视为 prolog/您的程序的影响。不是很科学/精确,但可能是一个前进的方向。

【讨论】:

  • 我在 Linux 上!感谢您的帮助,我目前正在寻找如何在 Prolog 之外准确测量流程统计信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多