我是Prolog的新手(对CS /编程来说还是新手),我正在尝试使用time / 1谓词评估和改进程序的性能。但是,我不确定我理解输出。例如,除了“MyProgram”的解决方案之外,查询时间(“MyProgram”)产生以下结果:
% 34,865,980 inferences, 4.479 CPU in 4.549 seconds (98% CPU, 7784905 Lips)
这是什么意思?有一些解释here,但我发现它还不够。
提前致谢!
答案 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,并且您的百分比非常低,则可能在某处存在锁定问题。