1 名前:デフォルトの名無しさん [2005/05/12(木) 21:44:01 ] 過去スレ Part1: piza2.2ch.net/tech/kako/987/987169286.html Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part7: pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part8: pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/ Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/ 関連リンクは>>2-10 あたり
209 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 13:02:21 ] xyzzy の話を引っ張るんですけど,確かに軽くていいエディタだと思います. 私も便利に使わせていただいてます.だけど,Common Lisp インタプリタとし ては,ちょっと遅いのではないでしょうか? ;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp (defun tarai (x y z) (if (<= x y) y (tarai (tarai (1- x) y z) (tarai (1- y) z x) (tarai (1- z) x y)))) (tarai 12 6 0) => 12 これの実行に65秒かかりました.バイトコンパイルしても30秒. (Celeron 2.6GHz, 756MB RAM) Petite Chez Scheme なら1秒前後で終わるのですが.
210 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 13:15:29 ] tarai懐かしいな。 久しぶりに回してみた。((tarai 12 6 0) @ Athlon FX-55) clisp インタプリタ 12秒 clisp コンパイラ 1.7秒 gcl インタプリタ 12秒 gcl コンパイラ 1.4秒 プチチーズ優秀だね。
211 名前:209 mailto:sage [2005/06/03(金) 13:46:23 ] なるほど,xyzzy Lisp が速いとは言えないけれど,比べた Petite Chez Scheme が速すぎるから,びっくりするような相対値になったのですね. Gauche とかだとどうなんだろう. Emacs Lisp でも試してみようと思ったけれど,エラーになって動かない. (error "Lisp nesting exceeds max-lisp-eval-depth") Emacs はなかなかよく分かりません. あと,野暮かも知れませんが,一応, Chez Scheme => しぇすきーむ Petite Chez Scheme => ぷてぃとしぇすきーむ Paul Graham => ぽーるぐれあむ が原音に近いのではないかと.
212 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 14:22:05 ] clisp 2.33.2: インタプリタ 15秒、コンパイラ 2.6秒 Emacs 21.3: インタプリタ 10.4秒、コンパイラ 4.7秒 Gauche 0.8.4: 3.3秒 SBCL 0.9.1: 0.4秒 (tarai 12 6 0) @ Pentium 4 2.4GHz > (error "Lisp nesting exceeds max-lisp-eval-depth") 再帰の深さが変数 max-lisp-eval-depth を超えたってことなんで増やせばいい
213 名前:210 mailto:sage [2005/06/03(金) 15:28:20 ] defunの行とifの行の間に (declare (fixnum x y z)) を入れると gcl のコンパイラのみ 1.4秒→1.2秒になったがその他は変化無し。思ったほど効かないな。
214 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 16:18:46 ] >>212 cmuclの結果も知りたい。
215 名前:デフォルトの名無しさん mailto:sage [2005/06/03(金) 16:38:47 ] lisp-worksでやってみた。 インタプリタだと66秒、コンパイルすると1秒以下になった。
216 名前:212 mailto:sage [2005/06/03(金) 17:03:28 ] >>214 CMUCL 19a: インタプリタ: 92秒 コンパイラ: 0.55秒 コンパイラ (declare (type fixnum x y z)): 0.23秒 コンパイラ (declare (optimize speed)): 0.53秒 コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.23秒 SBCL 0.9.1: コンパイラ: 0.42秒 コンパイラ (declare (type fixnum x y z)): 0.31秒 コンパイラ (declare (optimize speed)): 0.38秒 コンパイラ (declare (optimize speed) (type fixnum x y z)): 0.21秒
217 名前:209 mailto:sage [2005/06/03(金) 20:23:37 ] いろいろな方にベンチを実行していただき,ありがとうございます.大変参考 になりました. ところで,おまけとして,ラムダ式による遅延評価版を書いてみました. (参考)www.shiro.dreamhost.com/scheme/wiliki/wiliki2.cgi?Scheme%3a%a4%bf%a4%e9%a4%a4%a4%de%a4%ef%a4%b7%a4%d9%a4%f3%a4%c1 ;;;竹内関数 aka たらいまわしべんち (or 'Common 'Emacs) Lisp ;;;遅延評価版 (defun tarai (x y z) (if (<= (funcall x) (funcall y)) (funcall y) (tarai (lambda () (tarai (lambda () (- (funcall x) 1)) y z)) (lambda () (tarai (lambda () (- (funcall y) 1)) z x)) (lambda () (tarai (lambda () (- (funcall z) 1)) x y))))) こちらだと,引数が12 だとあっという間に終わってしまいますので,数字を 変えました. (tarai (lambda () 192) (lambda () 96) (lambda () 0)) => 192 先ほどの条件で,xyzzy だと13秒程度でした.いささか極端な例とは言え,遅 延評価のありがたみを痛感します.
218 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 08:23:03 ] (defun tarai (x y z) (let ((xx (funcall x)) (yy (funcall y))) (if (<= xx yy) yy (let ((x (lambda () xx)) (y (lambda () yy))) (tarai (lambda () (tarai (lambda () (- xx 1)) y z)) (lambda () (tarai (lambda () (- yy 1)) z x)) (lambda () (tarai (lambda () (- (funcall z) 1)) x y)))))))
219 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 13:02:22 ] xとyを遅延させる意味が無いように見えるんだが と、LISPをまるで知らない俺が適当に言ってみる
220 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 13:31:58 ] 無いね。z だけ遅延させるならこんな感じ? (defun tarai (x y z) (labels ((tarai-1 (x y fz) (if (<= x y) y (let ((z (funcall fz))) (tarai-1 (tarai-1 (1- x) y (lambda () z)) (tarai-1 (1- y) z (lambda () x)) (lambda () (tarai-1 (1- z) x (lambda () y)))))))) (tarai-1 x y (lambda () z))))
221 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:14:55 ] >>219 >>220 そんじゃ209が早くなったと言っているのは勘違いなの?
222 名前:デフォルトの名無しさん mailto:sage [2005/06/04(土) 22:23:48 ] >>221 >>217 の参考リンクの一番したみてみそ。Zだけの遅延評価のページが紹介されている罠
223 名前:デフォルトの名無しさん [2005/06/05(日) 17:29:43 ] 流れ断ち切って悪いけど DrSchemeって何て読むの? ドクタースキームでいいの?
224 名前:デフォルトの名無しさん [2005/06/05(日) 17:34:22 ] ドラスケ
225 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 18:09:09 ] >>224 採用。
226 名前:デフォルトの名無しさん mailto:sage [2005/06/05(日) 23:21:23 ] スキーム博士
227 名前:デフォルトの名無しさん [2005/06/05(日) 23:45:14 ] Note that they are listed as procedures, but implemented as syntax, so it is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages will not have a meaningful name in this case). これどういう意味か分かりますか? どなたか解説をお願いします。
228 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 01:08:09 ] のっけからtheyとか代名詞が出てくるんだから、どういう文脈の文章かを 説明しろよな。まあ内容から何の話か見当つくけどさ。
229 名前:?デフォルトの名無しさん mailto:sage [2005/06/06(月) 11:00:03 ] ぬるい実装の話みたいだが...どの処理系だ?
230 名前:デフォルトの名無しさん [2005/06/06(月) 17:33:33 ] >>290-210 Cだと78msec(Pentium4,2.25GHz)でした。 やはりLISPは遅いようですね。 int tarai(int x,int y,int z) { if(x<=y) return y; else return tarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(z-1,x,y)); }
231 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 19:53:32 ] とりあえず空気嫁、と。 空気をどうしても読めなかったら、 悲惨な喪毎の頭のベンチマークでも並べとけと。
232 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 20:47:44 ] >>230 >>220 なら sbcl on Pentium 4 2.4GHz で 7μsecだよ。 がんばって遅延評価実装してみ。
233 名前:227 mailto:sage [2005/06/06(月) 20:57:01 ] >>228 ごめん、もう分かった。 >>229 MzScheme です。
234 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 21:29:03 ] >>227 R5RS関連だろうと思ってたら、やっぱコレか。 PLT Foreign Interface Manual PLT <scheme@plt-scheme.org> 299.100Released March 2005 download.plt-scheme.org/doc/299.100/pdf/foreign.pdf 2. Foreign Interface This is a description of the foreign interface. The interface has some parts implemented in C (plt/src/foreign/foreign.c) which is available as a built-in #%foreign module. This module is not intended for general use as is, and further documentation can be found in the source. The relevant functionality is provided via the foreign module in MzLib (foreign.ss). 2.2 Simple Types 2.2.4 Type Constructors Since types are first-class values, there are several type constructors that build type objects. These are just the simple ones, more constructors are described below. Note that they are listed as procedures, but implemented as syntax, so it is possible to use a name where the syntactical context implies one (they can also be used as values, but error messages will not have a meaningful name in this case).
235 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 21:49:17 ] >>233 お願いだから次からはもうちょっと質問の仕方も上達してくれよ
236 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 23:21:44 ] class tarai { int x, y; const tarai* tp; public: tarai(int y) : x(0), y(y), tp(0) {} tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {} int operator()() const { if (x <= y) return y; int z = (*tp)(); return tarai(tarai(x-1,y,*tp)(),tarai(y-1,z,tarai(x))(),tarai(z-1,x,y))(); } }; LISPをまるで知らない俺が五分で作ったC++遅延評価版 tarai(192, 96, tarai(0))()で、0.01秒くらい?
237 名前:デフォルトの名無しさん mailto:sage [2005/06/06(月) 23:53:03 ] tarai(192, 96, 0)と使えるように直した class tarai { int x, y; const tarai* tp; public: tarai(int y) : x(0), y(y), tp(0) {} tarai(int x, int y, const tarai& t) : x(x), y(y), tp(&t) {} operator int() const { if (x <= y) return y; int z = *tp; return tarai(tarai(x-1,y,*tp),tarai(y-1,z,x),tarai(z-1,x,y)); } };