【问题标题】:Chez Scheme allocation: --program vs --scriptChez 方案分配:--program vs --script
【发布时间】:2010-03-04 11:13:19
【问题描述】:

考虑一下Chez Scheme 代码:

(进口(chezscheme)) (define (list-enumerate ls val proc) (让循环 ((ls ls) (return?#f) (val val)) (如果(或(null?ls) 返回?) 值 (带值调用(lambda()(proc val(car ls))) (lambda (return?val) (循环(cdr ls)返回?val)))))) (定义(列表索引 ls proc) (列表枚举ls 0 (拉姆达(我 elt) (如果 (proc elt) (值#t i) (值 #f (+ i 1)))))) (定义 n 100000) (定义数据(iota n)) (时间(列表索引数据(lambda (elt) (= elt (- n 1)))))

运行它:

~ $ 方案 --script ~/scratch/_list-enumerate-allocation-test-chez-a.sps (时间(列表索引数据...)) 没有收藏 3 毫秒经过的 CPU 时间 4 毫秒经过的实时时间 分配了 8 个字节

哇,它报告说只分配了 8 个字节。

让我们使用--program 选项而不是--script 再次运行它:

~ $ 方案 --program ~/scratch/_list-enumerate-allocation-test-chez-a.sps (时间(列表索引数据...)) 没有收藏 3 毫秒经过的 CPU 时间 3 毫秒经过的实时时间 分配了 800000 字节

哎呀,分配了 800000 字节。

有什么区别?

埃德

【问题讨论】:

    标签: scheme chez-scheme


    【解决方案1】:

    这是来自 Kent Dybvig 的回应:


    这是一个有趣的问题。

    使用 REPL 语义的 --script 运行时,变量 在脚本中定义的,如 list-enumerate 和 list-index,是可变的, 这会抑制过程间优化,包括内联。什么时候 使用 --program 运行,但是,变量是不可变的,这允许 过程间优化。

    在这种情况下,--program 允许编译器将列表枚举内联到 list-index 的主体,然后是 list-index 中的 lambda 表达式 正文进入列表枚举的正文。最终结果是有条件的 call-with-values 生产者表达式中的表达式。这导致 编译器为消费者创建一个闭包,以避免代码 沿条件的 then 和 else 分支重复。这 每次通过列表枚举的循环创建闭包,导致 额外的分配开销。这就是优化经常采用的方式。 大多数时候你会赢,但有时你会输。好消息是,总的来说, 即使在您的计划中,收益也超过了成本。我打电话给 循环中的列表索引(修改后的代码如下)并发现与 --program,代码运行速度快了大约 30%。

    肯特


    (进口(chezscheme)) (define (list-enumerate ls val proc) (让循环 ((ls ls) (return?#f) (val val)) (如果(或(null?ls) 返回?) 值 (带值调用(lambda()(proc val(car ls))) (lambda (return?val) (循环(cdr ls)返回?val)))))) (定义(列表索引 ls proc) (列表枚举ls 0 (拉姆达(我 elt) (如果 (proc elt) (值#t i) (值 #f (+ i 1)))))) (定义 n 100000) (定义数据(时间(iota n))) (让 () (定义 runalot (拉姆达(我 thunk) (让循环 ([i i]) (让 ([x (thunk)]) (如果 (fx=​​ i 1) X (循环 (fx- i 1))))))) (时间 (runalot 1000 (拉姆达() (列表索引数据 (lambda (elt) (= elt (- n 1))))))))

    【讨论】:

      猜你喜欢
      • 2012-08-30
      • 1970-01-01
      • 2012-01-04
      • 2020-07-04
      • 2013-11-06
      • 2023-03-10
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多