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

序言:调用time/1的结果实际上意味着什么?,time,prolog,swi-prolog,Time,Prolog,Swi Prolog,我不熟悉Prolog(一般来说,对CS/编程也是相当陌生的),我正试图通过使用time/1谓词来评估和改进我的程序的性能。但是,我不确定我是否理解输出。例如,除了“MyProgram”的解决方案外,查询时间(“MyProgram”)还产生以下结果: %34865980个推论,4.549秒4.479 CPU(98%CPU,7784905个嘴唇) 这是什么意思?有一些解释,但我发现这还不够 提前谢谢 首先,有关Prolog或任何编程语言中基准测试困难的一般信息,请参见答案。答案与ECLiPSe语言有

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

%34865980个推论,4.549秒4.479 CPU(98%CPU,7784905个嘴唇)

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

提前谢谢

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

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

equal_to_one(X) :- X =:= 1.
如果我们跟踪执行情况(顺便说一句,这是更好地理解Prolog工作原理的一个好方法),我们会得到:

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

当我们使用time/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时间和总时钟时间(有关更多信息,请参阅参考答案)

最后,我们看到每次执行都有不同的%CPU和LIPS。您不必太担心这些数字,因为它们表示CPU使用的百分比和每秒进行的平均逻辑推断,并且由于明显的原因,每次执行时这些数字总是不同的

PS:可以找到一个类似的SO问题,其含义如下。基本数据通过以下调用进行采样:

  get_time(Wall)
  statistics(cputime, Time)
  statistics(inferences, Inferences)
然后显示的是:

%1个推论,%2个CPU在%3秒内(%4%CPU,%5个嘴唇)
%1:推论2-推论1
%2:Time2-Time1
%3:Wall2-Wall1
%4:四舍五入(100*%2/%3)
%5:整数(%1/%2)

在单线程应用程序和没有其他应用程序的情况下,我们仍然有%2=<%3如果有单独的GC线程,则随后%4将是小于或等于100的一个先例。如果您的应用程序没有执行I/O,并且您的百分比非常低,那么您可能会在某个地方遇到锁定问题

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