Prolog:调用time/1的结果实际上意味着什么



我是Prolog的新手(通常对CS/编程也相当陌生),我正试图通过使用time/1谓词来评估和改进程序的性能。但是,我不确定我是否理解输出。例如,除了"MyProgram"的解决方案之外,查询时间("MyProgram)还会产生以下结果:

% 34,865,980 inferences, 4.479 CPU in 4.549 seconds (98% CPU, 7784905 Lips)

这是什么意思?这里有一些解释,但我发现这还不够。

提前感谢!

首先,请参阅此答案,了解有关Prolog或任何编程语言中基准测试困难的一些一般信息。答案涉及ECLiPSe语言,它在内部使用Prolog,因此您将熟悉语法。

现在,让我们来看一个简单的例子:

equal_to_one(X) :- X =:= 1.

如果我们跟踪执行(顺便说一句,这是更好地理解Prolog如何工作的好方法),我们得到:

?- trace, foo(1).
Call: (7) foo(1) ? creep
Call: (8) 1=:=1 ? creep
Exit: (8) 1=:=1 ? creep
Exit: (7) foo(1) ? creep

请注意跟踪中出现的两个调用和两个出口。在第一次调用中,foo(1)与Prolog文件中定义的事实/规则匹配,并成功找到foo/1,然后在第二次调用中(成功)执行主体。随后,这两个出口只是表示从为true的语句中退出(两个调用)。

当我们用时间/1运行程序时,我们看到:

?- time(foo(1)).
% 2 inferences, 0.000 CPU in 0.000 seconds (86% CPU, 69691 Lips)
true.
?- time(foo(2)).
% 2 inferences, 0.000 CPU in 0.000 seconds (82% CPU, 77247 Lips)
false.

两个查询都需要2个(逻辑)推断才能完成。这些推断代表了上面描述的调用(即,程序"试图匹配"某个东西两次,不管数字是否等于1)。正因为如此,推断是程序性能的良好指示,不是基于任何硬件特定属性,而是基于算法的复杂性。

此外,我们看到CPU和秒,它们分别表示执行程序时花费的CPU时间和总时钟时间(有关更多信息,请参阅参考的SO答案)。

最后,我们看到每个执行都有不同的%CPU和LIPS。你不应该太担心这些数字,因为它们代表了CPU使用的百分比和每秒逻辑推理的平均值,由于明显的原因,每次执行的数字总是不同的。

附言:类似的SO问题可以在这里找到

含义如下。基本数据通过以下调用进行采样:

get_time(Wall)
statistics(cputime, Time)
statistics(inferences, Inferences)

然后显示的是:

"%1推断,%3秒内%2 CPU(%4%CPU,%5嘴唇)">
%1:推断2-推断1
%2:Time2-Time1
%3:Wall2-Wall1
1%4:圆形(100*%2/%3)
%5:整数(%1/%2)

在单线程应用程序和其他应用程序中,我们仍然有%2=<%3如果有一个单独的GC线程,那么%4将是低于或等于100的百分比。如果您的应用程序不执行I/O操作,并且您的百分比非常低,则可能在某个位置出现锁定问题。

相关内容

最新更新