Prolog:来自时间/ 1的结果实际意味着什么?

时间:2016-06-03 00:06:17

标签: time prolog swi-prolog

我是Prolog的新手(对CS /编程来说还是新手),我正在尝试使用time / 1谓词评估和改进程序的性能。但是,我不确定我理解输出。例如,除了“MyProgram”的解决方案之外,查询时间(“MyProgram”)产生以下结果:

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

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

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

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,然后在第二次调用中,(成功)执行了body。随后,这两个出口只表示退出真实的陈述(两个呼叫)。

当我们用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时间和总时钟时间(有关详细信息,请参阅SO答案)。

最后,我们看到每次执行都有不同的%CPU和LIPS。您不应该过多担心这些数字,因为它们代表CPU使用的百分比和每秒平均逻辑推理量,并且由于显而易见的原因,每次执行时这些数字总是不同的。

PS:可以找到类似的SO问题here

答案 1 :(得分:1)

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

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

然后显示的是:

  

'%1推理,%2 CPU%3秒(%4%CPU,%5 Lips)'
  %1:推论2 - 推论1
  %2:Time2-Time1
  %3:Wall2-Wall1
  %4:圆形(100 *%2 /%3)
  %5:整数(%1 /%2)

在单线程应用程序中,没有其他应用程序,我们仍然有%2 =< %3如果有单独的GC线程,则后面的%4将是低于或等于100的百分比。如果您的应用程序没有进行I / O,并且您的百分比非常低,则可能在某处存在锁定问题。

相关问题