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

Why is this lisp benchmark (in sbcl) so slow?

因为我对 C++ 和 Lisp 都很感兴趣,所以我尝试重现所提供的基准测试 here written by Guillaume Michel. The benchmark is basically a DAXPY BLAS Level 1 operation performed multiple times on big arrays. The full code was thankfully posted on github,并且在两种语言中大约占一页。

遗憾的是,我发现我不可能达到他的 lisp 计算速度。

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

Size | C++ | Common Lisp

100,000,000 | 181.73 | 183.9

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

Size | C++ | Common Lisp

100,000,000 | 195.41 | 3544.3

因为我想要额外的测量,所以我使用 time 命令启动了两个程序并得到(缩短):

$ time ./saxpy
real    0m7.381s
$ time ./saxpy_lisp
real    0m40.661s

我假设了造成这种明显差异的不同原因。我浏览了两个代码示例,但发现 C++ 和 Lisp 版本之间在算法或数字上没有太大差异。然后我想, buildapp 的用法造成了延迟,所以我直接在REPL中启动了基准测试。我最后的办法是尝试另一个版本的 sbcl,所以我下载了最新的 sbcl-1.3.11 并在那里进行了评估——仍然(优化的)Lisp 版本比它的 C++ 对应版本需要更长的时间。

我错过了什么?

我无法复制您的发现:

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 不公平。