为什么这个lisp基准(在sbcl中)这么慢?

时间:2016-11-05 19:08:50

标签: common-lisp performance-testing sbcl

由于我对C ++以及Lisp感兴趣,我试图重现Guillaume Michel编写的here基准。该基准测试基本上是在大型阵列上多次执行的DAXPY BLAS 1级操作。幸运的是,完整的代码发布在github上,两种语言大致相当于一页。

可悲的是,我发现我无法达到他对lisp计算的速度。

对于Linux,他得到了类似的C ++和Lisp的结果:

  

尺寸| C ++ | Common Lisp

     

100,000,000 | 181.73 | 183.9

我的电脑上的数字(自然地)不同:

  

尺寸| C ++ | Common Lisp

     

100,000,000 | 195.41 | 3544.3

由于我想要一个额外的测量,我使用 if(sigwaitinfo(&sig_set,NULL) == SIGUSR1){ printf("signal received\n"); } 命令启动了两个程序并得到(缩短了):

time

我认为这种明显的差异有不同的原因。我扫描了两个代码示例,但发现C ++和Lisp版本之间没有大的算法或数字差异。然后我想,$ time ./saxpy real 0m7.381s $ time ./saxpy_lisp real 0m40.661s 的使用造成了延迟,所以我直接在REPL中开始了基准测试。我最后的尝试是尝试另一个版本的buildapp,所以我下载了最新的sbcl并在那里进行了评估 - 仍然(优化的)Lisp版本需要比它的C ++版本更长的时间。

我错过了什么?

1 个答案:

答案 0 :(得分:4)

我无法复制你的发现:

sylwester@pus:~/a/bench-saxpy:master$ sbcl --dynamic-space-size 14000
This is SBCL 1.3.1.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (compile-file "saxpy.lisp")

; compiling file "/pussycat/natty-home/westerp/apps/bench-saxpy/saxpy.lisp" (written 06 NOV 2016 12:04:30 AM):
; compiling (DEFUN SAXPY ...)
; compiling (DEFUN DAXPY ...)
; compiling (DEFMACRO TIMING ...)
; compiling (DEFUN BENCH ...)
; compiling (DEFUN MAIN ...)

; /pussycat/natty-home/westerp/apps/bench-saxpy/saxpy.fasl written
; compilation finished in 0:00:00.038
#P"/pussycat/natty-home/westerp/apps/bench-saxpy/saxpy.fasl"
NIL
NIL
* (load "saxpy.fasl")

T
* (main t)
Size, Execution Time (ms)
10, 0.0
100, 0.0
1000, 0.0
10000, 0.1
100000, 0.49999997
1000000, 3.6
10000000, 39.2
100000000, 346.30002
(NIL NIL NIL NIL NIL NIL NIL NIL)

所以在我的机器上花了346ms(相对较旧的机器)。整个测试花了大约5秒钟,但这是一系列的测试。有趣的是,从sbcl运行比制作图像并运行它更快:

sylwester@pus:~/a/bench-saxpy:master$ make lisp
buildapp --output saxpy_lisp --entry main --load saxpy.lisp --dynamic-space-size 14000
;; loading file #P"/pussycat/natty-home/westerp/apps/bench-saxpy/saxpy.lisp"
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into saxpy_lisp:
writing 4944 bytes from the read-only space at 0x20000000
writing 3168 bytes from the static space at 0x20100000
writing 60522496 bytes from the dynamic space at 0x1000000000
done]
sylwester@pus:~/a/bench-saxpy:master$ ./saxpy_lisp 
Size, Execution Time (ms)
10, 0.0
100, 0.0
1000, 0.0
10000, 0.0
100000, 0.4
1000000, 3.5
10000000, 40.2
100000000, 369.49997

在C版本中我得到:

100000000, 296.693634, 295.762695, 340.574860

似乎C版本实际上以3种不同的方式计算相同的内容并报告所花费的时间。使用time不会公正。