7

最近、SBCL ユーザー マニュアルを読んでいて、タイトルの質問について疑問に思い始めました。明らかに、一部の Lisp、たとえば clojure は、コードを簡単に並列化できるように、すべての副作用を禁止しています。Common Lisp では副作用が許容されているため、特定の関数が「ダーティ」または「クリーン」であるという事実がコンパイルに影響するかどうか疑問に思っていました。

たとえば、CMUCL コンパイラ マニュアルlet の最適化では、多くの場合、新しい変数をバインドするために「let」を使用する方が、「setq」で変更するよりも効率的であることが示されています。関数呼び出しに対して同様のことが行われているかどうかを尋ねていると思います。

sbcl マニュアルの関連セクションを読み、stackoverflow に関する質問に答えましたが、これに対する答えが見つかりませんでした。

4

1 に答える 1

1

short: 速くありません。時には実際に遅くなります。

長いです:

SBCL-devel の Stas Boukarev 氏によると、

SBCL は、関数に副作用がないことさえ知りません。その上、ほとんどの場合、副作用が最も最適な方法です。

などの破壊的な関数は、非破壊的な関数 (この場合は非破壊的なバージョン)nreverseよりも高速になる傾向があるという事実を認識しています。reverseまた、多くの挫折も伴います。ピーター・シーベルが言ったように:

各リサイクル機能は、足元に向けられた装填済みの銃です。

于 2016-01-21T23:57:27.267 に答える