【问题标题】:How can I tell if my tail-recursive Scheme function is being optimized correctly如何判断我的尾递归 Scheme 函数是否被正确优化
【发布时间】:2010-11-17 10:15:29
【问题描述】:

我有一个 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 传入。

【问题讨论】:

  • 可能是你的代码的其他部分隐藏了缓慢,但我也会尝试不同的 Scheme 实现:Gambit 和 Bigloo 是两个值得尝试的编译器。

标签: scheme compiler-optimization tail-recursion


【解决方案1】:

那个函数确实是尾递归的,所以你很好。但是,尾递归只是意味着堆栈空间不会增长,并不是说您的程序可以保证快速运行。如果您想查看您的程序是否真的以尾递归方式运行,请在运行它的同时观察 Chicken 占用的总内存(并确保您没有在 make-some-updated 中分配内存,您可能是这样)。如果内存增长,那么 Chicken 没有按照标准正确编译您的程序。

【讨论】:

  • 另一个要尝试的是 DrRacket——你可以输入代码并点击“检查语法”按钮——然后将鼠标悬停在表达式上会显示指示尾部位置的粉红色箭头。
  • 啊。我认为尾部调用选项除了节省堆栈空间外还提高了速度。感谢您的澄清。现在我只需要弄清楚我的速度在哪里?
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2012-11-15
  • 2011-09-04
  • 1970-01-01
相关资源
最近更新 更多