gpt4 book ai didi

timer - 如何在 SWI-Prolog 中定期调用 statistics/2?

转载 作者:行者123 更新时间:2023-12-01 12:44:18 24 4
gpt4 key购买 nike

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

最佳答案

我得出的结论是,不能将警报配置为定期触发谓词,或者至少不能自动触发。虽然 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 为我的时间和(不太可能)内存测量插入了不确定性,但这种不确定性最终是由 statistics/2 谓词确定。由于此调用会影响 CPU 时间,ma​​gus 建议的解决方案——使用“主要标准”样本来查找我的测量值的偏移量——可能是减少这种不确定性的一种方法。ma​​gus p>

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

关于timer - 如何在 SWI-Prolog 中定期调用 statistics/2?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21711519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com