wamcc:将Prolog编译成C (No.7-6)

6. 绩效评估

现在让我们细化wamcc系统的系统并比较其他Prolog系统,无论是学术或商业。

6.1 基准程序
表1给出传统基准wamcc的表现。时序以秒为单位的Sparc2(2.85MIPS)使用gcc2.5.8的-O2选项。对于每一个程序,可以发现:Prolog的源程序的行数,总得编译时间(Prolog到C,gcc,连接器),对象代码的大小和最终的可执行文件(字节)和时间。

wamcc:将Prolog编译成C (No.7-6)_第1张图片

表格1:wamcc的表现

6.2 wamcc与学术的Prolog系统
让我们在第一时间同一类别,把wamcc与其他系统比较:学术Prolog系统,通常由一个人开发为研究目的并通过FTP免费发布。在这么多系统中,我们选择了最流行的。因此,我们有:

BinProlog 3.0:这个实现是基于“二值化”的条款,这大致包括显式延续。WAM是模拟专业和抽象的代码(C语言编写的一个模拟器)。最近,笔者还调查到一个翻译的C[12]。
XSB-Prolog 1.4.0:这种语言是流行的SB-Prolog追随者。它还使用C语言编写一个模拟器,但集成了专门部分实例化调用的部分评价技术。它也可以检测某些确定情况,并以如Prolog的if-then-else来有效地编译控制结构。编译阶段因此可以很长。
SWI-Prolog 1.8.11:本系统的特点是它的编译速度,它提供了多种内置谓词。这是到现在为止最常用的学术Prolog系统。

表2显示了这些不同的系统的执行时间和wamcc的平均加速。溢出表中的条目意味着内存被耗尽前完成计划的最大堆栈大小。

wamcc:将Prolog编译成C (No.7-6)_第2张图片

表2:wamcc相对于其他学术Prolog

wamcc平均是BinProlog的两倍。然而,在nrev基准,BinProlog执行速度比wamcc快。这是由于非常简单的WAM使用wamcc,wamcc使用不包含任何众所周知的优化(喜欢单独统一流,浅回溯,统一重新排序,...)。我们还可以备注wamcc比XSB-Prolog语言的2.7倍,比SWI-Prolog快5.6倍(不考虑tak基准)。

6.3 wamcc与商业Prolog系统
现在让我们比较wamcc与商业Prolog系统,通常由一些人开发一些年。Prolog系统和wamccb比较的Prolog系统有:

Sicstus:这个系统很受欢迎,因为它成为了提供高效收少量费用系统的先导之一。它已成为一个Prolog系统事实上的表现参考。目前的版本可以产生字节码(模拟),以及本机代码(SPARC)。我们这里比较wamcc这两个版本。
Quintus:在很长一段时间,它是最有效的系统。它是基于优化模拟器汇编语言编写的。但是请注意,我们只有版本2.5.1,这不是最近的版本。
Aquarius:这是目前最高效的Prolog系统。它非常复杂,通过一个原始抽象机产生比WAM更低级的本地代码(BAM)。编译器执行许多优化(数据流分析,抽象解释,确定性检测,...)翻译BAM到本地代码也相当复杂,集成了Sparc机器的指令重排序实例。

wamcc:将Prolog编译成C (No.7-6)_第3张图片
表2:wamcc相对于商业Prolog
表3列出了这些系统的执行时间和wamcc的平均速度(或当前标了#符号时放缓)。让我们注意到最初目标达成,wamcc比仿真Sictus快1.6倍。它比本地Sicstus代码慢1.7倍和Quintus相当。wamcc的表现平均比Aquarius慢3.5倍,但这主要是由于Aquarius在tak基准的良好表现(比wamcc快9倍),因为它可以检测确定性和优化整数的终端调用。让我们注意到,Aquarius程序比C程序块两倍!然而,真正的Prolog程序(使用统一和回溯)的差别是不大的,例如斑马拼图Aquarius只快1.3倍,boyer程序Aquarius快两倍不到。我们标注一下,这个系统不处理模块,从而可以在编译时提取更多的信息以产生更好的代码(如符号可以是前哈希编码的)。当处理几个模块时,这不再可能。

据观察wamcc由一个人仅在几个月内开发,因此它可以很骄傲地和几个实施者的团队写了几年的复杂系统相比较。另一个重要问题是,事实上wamcc简单得多。比较核心的代码复杂性(本地代码)Sicstus(35000行C)和wamcc(6000行),我们的性能优势远胜Sicutus(系数1.6)。同样Sicstus编译器包括9000行Prolog代码,而wamcc仅为3000行。关于Quintus,汇编语言的大量使用,给出的系统比较难以维护和扩展,而性能并不比wamcc好。Aquarius具有显著地表现,但主要的确定性和运算程序不是所希望的最典型的Prolog应用。相反,事实上Aquarius需要38分钟编译400行的长程序(减速机)似乎是不现实的。wamcc只需要5分钟生成一个可执行程序,而Aquarius可能慢2.7倍,但无论如何需要不到一秒钟的时间。Aquarius系统的另一个缺点是生成代码的大小比wamcc的要大4倍左右。

你可能感兴趣的:(wamcc:将Prolog编译成C (No.7-6))