1

基本的なフォームが次のようなScheme関数があります

(define (foo param var)  
  (cond ((end-condition) (return-something))  
        ((other-end-condit) (return-something-else))  
        (else  
         (let ((newvar (if some-condition   
                           (make-some-updated var)  
                           (destructive-update! var))))  
           (foo param newvar)))))  

これは明らかに、コンパイルの繰り返しに合わせて最適化する必要があるもののように感じますが、(チキンを使用して) コンパイルすると、それでも信じられないほど遅く実行されます。(R5RS の仕様を理解している場合: http://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html、これは動作するはずです)

Python で while ループを使用してまったく同じアルゴリズムを作成し、解釈されたプログラムは数秒で終了しました。コンパイルされたスキームには約 15 分かかりますが、アルゴリズムは同じであると確信しています。

他に何が考えられるのか考えられないので、これは最適化されていない末尾再帰の問題だと思いますが、それを理解することはできません。何か案は?var はハッシュであり、破壊的な更新は単に要素を追加するだけですが、newvar として渡される更新されたハッシュも返します。

4

1 に答える 1

4

その関数は確かに末尾再帰なので、そこに問題はありません。ただし、末尾再帰は、スタックスペースが拡大しないことを意味するだけであり、プログラムが高速で実行されることが保証されているわけではありません。プログラムが実際に末尾再帰的に実行されているかどうかを確認したい場合は、Chickenが使用する合計メモリを監視しながら実行します(メモリを割り当てていないことを確認してくださいmake-some-updated)。メモリが増えると、Chickenは標準に従ってプログラムを正しくコンパイルしていません。

于 2010-11-17T13:13:56.813 に答える