2016-11-05 14 views
3

私はLispだけでなくC++にも興味があるので、Guillaume Michelによって書かれたベンチマークhereを再現しようとしました。ベンチマークは、基本的に大規模アレイで複数回実行されるDAXPY BLAS Level 1操作です。完全なコードは、ありがたいことにgithubに投稿されており、両方の言語で約1ページです。なぜこのlispベンチマーク(sbcl)は遅いのですか?

悲しいことに、私はlispの計算の速度に到達することができないことを発見しました。 Linuxの場合

、彼はC++だけでなく、Lispのための同様の結果だ:

サイズ| C++ | Common Lisp

100,000,000 | | 181.73 | |

サイズ:183.9

数字は私のPC上の両方(自然に)異なります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++のものよりずっと長く必要です。

私には何が欠けていますか?

+1

Lispコードをコンパイルしましたか? – Barmar

+0

私はREPLの中から(lispfileをロードして)bashから--loadを実行し、コンパイル済みの(?)file.faslファイルを試しました。 – claudio

+0

'.fasl'ファイルはコンパイル済みのバージョンです。 – Barmar

答えて

4

私はあなたの調査結果を複製することはできません。

[email protected]:~/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秒かかりましたが、これは一連のテストです。私が取得C版で

[email protected]:~/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] 
[email protected]:~/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バージョンは、実際に3種類の方法で同じことを計算のよう

100000000, 296.693634, 295.762695, 340.574860 

をそれはそう速く画像を作成し、それを実行するよりもSBCLからして実行するとことは興味深いですそれに要した時間を報告します。 timeを使ってもそれは正義ではありません。

+0

まずは、時間をかけて複製することに感謝します。 2回目:私はあなたがしたのと同じ手順をやったが、コンパイル時に 'note:GENERIC- *(cost 30)'と 'note:GENERIC- +(cost 10)'を余儀なくされたような多くのノートに遭遇した'daxpy'と' saxpy'の関数です。あなたはあなたのポストでそれらを削除しましたか?そして:すでに10000ステップで、私はあなたの0.0とは対照的に0.7を持っています - だから違いはあります。そして、私はかなり新しいmashineを持っていることを言及する必要があるので、私はより速い出力を期待しています... – claudio

+0

@claudio私はすべての出力を含め、git repoのみを使用しました。私は私のMacで同じことをして、それは非常に速かった、私は 'buildapp'を持っていないので、最初の手順に続いて約208ms。あなたが入手したメッセージは[lispforum post](http://www.lispforum.com/viewtopic.php?f=2&t=3204)に記載されています – Sylwester

+1

これはあなたのバージョン( 'sbcl-1.3.1')をダウンロードしました。あなたのステップを再度複製しました。それで、コンパイラノートもなく、速度も今より*はるかに速くなりました。私は、私のオリジナルの質問に答えます。遅い理由はsbclのバージョンにあります。私はあなたの答えを私の問題の解決策としてマークし、これをsbclの開発者に向けます。ありがとうございました! – claudio

関連する問題