【发布时间】:2016-05-11 19:05:10
【问题描述】:
更新:11.6.2016
我在 SICStus Prolog 4.3.2 中观察到的令人费解的性能差异在最近发布的 SICStus Prolog 4.3.3 中完全消失了。 荣誉!
我更新了下面的“运行时”表以包括 SICStus Prolog 4.3.3。亮点包括:
-
(is)/2比以前快了 10 倍。 -
val_of/2的速度也非常快,几乎提高了 2 倍!
MEGO;-)
当 answering 问题“Size Procedure in Prolog Language” SO-user @ThanosTintinidis 提出了一个非常简单的方法1介绍初学者导出length/2:
[...] 另请注意,
E仅需要实例化,因为 is 将评估表达式。你可以这样写:大小([],0)。 尺寸([_|Xs], 1+E) :- 尺寸(Xs, E)。如果你这么称呼它:
?- size([_,_], E)。 E = 1+(1+0)。很有趣,不是吗?您可能想要评估最后一个
E,即调用?- size([1,2], E), N is E。 [...]
有趣吗? 非常有趣! 许多有趣的实验摆在面前:
-
左倾与右倾树
list_sizL([], 0)。 % l左倾 list_sizL([_|Es], N+1) :- list_sizL(Es,N)。 list_sizR([], 0)。 % r右倾 list_sizR([_|Es], 1+N) :- list_sizR(Es,N)。 -
内置
val_of(V, E) :- ( E = E1+E2 -> val_of(V1, E1), val_of(V2, E2), V 是 V1+V2 ;数字(E)-> V = E )。(is)/2vsval_of/2
为了测量运行时间,我使用不同的 Prolog 处理器运行了 go(2000000)2:
在Intel Core i7-4700MQ 上,我使用 SICStus 和 SWI 观察到以下运行时:
| SWI | SICStus | SICStus | | 7.3.20 | 4.3.2 | 4.3.3 | -------------------+--------+---------+---------| list_sizL + (is) | 208 毫秒 | 650 毫秒 | 60 毫秒 | 3.4 倍 list_sizL + val_of | 381 毫秒 | 100 毫秒 | 60 毫秒 | 6.3 倍 -------------------+--------+---------+---------| list_sizR + (is) | 88 毫秒 | 660 毫秒 | 70 毫秒 | 1.2x list_sizR + val_of | 346 毫秒 | 100 毫秒 | 60 毫秒 | 5.7 倍 -------------------+--------+---------+---------|我对这些(可重现的)结果感到困惑......有人可以告诉我发生了什么吗?
脚注 1:为了简洁和可读性,变量名称稍作修改。
脚注 2:运行 SWI-Prolog 7.3.20带有合适的命令行参数swipl -G2G -L2G -O。
【问题讨论】:
标签: prolog swi-prolog sicstus-prolog