Common lisp 为什么这个lisp基准(在sbcl中)如此缓慢? 因为我对C++和Lisp感兴趣,所以我尝试重现Guillaume Michel所写的基准。基准测试基本上是在大型阵列上多次执行的DAXPY BLAS 1级操作。谢天谢地,完整的代码发布在了网站上,并且是用两种语言编写的,大约有一页

Common lisp 为什么这个lisp基准(在sbcl中)如此缓慢? 因为我对C++和Lisp感兴趣,所以我尝试重现Guillaume Michel所写的基准。基准测试基本上是在大型阵列上多次执行的DAXPY BLAS 1级操作。谢天谢地,完整的代码发布在了网站上,并且是用两种语言编写的,大约有一页,common-lisp,performance-testing,sbcl,Common Lisp,Performance Testing,Sbcl,遗憾的是,我发现我不可能达到他对lisp的计算速度 对于Linux,他得到了与C++和Lisp:类似的结果。 大小C+++普通LISP 100000000 | 181.73 | 183.9 我的电脑上的数字(自然)不同: 大小C+++普通LISP 100000000 | 195.41 | 3544.3 由于我需要一个额外的测量值,我用time命令启动了这两个程序,并得到(缩短): 对于这种明显的差异,我假设了不同的原因。我扫描了两个代码样例,但是没有发现C++和LISP版本之间有很大的算法或

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

对于Linux,他得到了与C++和Lisp:

类似的结果。

大小C+++普通LISP

100000000 | 181.73 | 183.9

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

大小C+++普通LISP

100000000 | 195.41 | 3544.3

由于我需要一个额外的测量值,我用
time
命令启动了这两个程序,并得到(缩短):

对于这种明显的差异,我假设了不同的原因。我扫描了两个代码样例,但是没有发现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)
在C版本中,我得到:

100000000, 296.693634, 295.762695, 340.574860

看起来C版本实际上以3种不同的方式计算相同的值,并报告所用的时间。使用
时间
是不公平的。

你编译了Lisp代码吗?我从REPL中尝试了(加载“lispfile”),从bash中加载,并用编译的(?)文件.fasl文件尝试了这两种方法。
.fasl
文件是编译版本。请确保用
设置了最佳的编译器优化设置(declaim(optimize)(speed 3)(安全设置0))
编译是时,这些都在重要函数中(请参阅github代码)。我也试着把它放在全球范围内(就像你建议的那样)——没有大的区别首先:非常感谢你花时间和复制。第二:我执行了与您完全相同的步骤,但确实遇到了许多注释,如
note:forced to do GENERIC-*(成本30)
note:forced to do GENERIC-+(成本10)
在编译函数
daxpy
saxpy
时。你在帖子中删除了它们吗?而且:已经有10000个步骤了,我的0.7与你的0.0相比,所以即使有一些差异。我应该提到我有一个全新的mashine,所以我希望更快的输出…@claudio我包括了所有的输出,只使用了git回购。我在我的mac电脑上也做了同样的操作,速度快得多,第一次操作后大约需要208ms,因为我没有
buildapp
。您收到的消息在“好的”,我下载了您的版本(
sbcl-1.3.1
),并再次复制了您的步骤。有了它,没有编译器注释,速度也快了很多。我认为,这回答了我最初的问题——缓慢的原因在于sbcl的版本。我会将你的答案标记为我问题的解决方案,并将其交给sbcl的开发人员。再次感谢你@claudio我在macOs上测试时使用的SBCL版本是1.3.11,因此在所有平台上可能不是相同的回归。另外,我的两台机器都是64位的,而关于result not be fixnum的注释表明您可能正在使用32位机器?不,我有一台64位机器。我已经在我的笔记本电脑上试用了基准测试,32位,
sbcl-1.3.6
,也得到了编译器注释和慢速基准测试。
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
100000000, 296.693634, 295.762695, 340.574860