【问题标题】:Tailcall parameter in Expression.LambdaExpression.Lambda 中的尾调用参数
【发布时间】:2011-08-18 15:06:08
【问题描述】:

为尾调用优化提供参数背后的原因是什么

Expression.Lambda(Expression body,bool tailcall,
IEnumerable<ParameterExpression> Parameters)

只要它不影响结果,为什么我们明确需要为它指定一个值。而且我觉得进行尾调用优化总是更好。对此你有什么不同的想法

【问题讨论】:

  • Ashley:如果没有完整的堆栈跟踪,可能很难调试!

标签: c# generics c#-4.0 lambda expression-trees


【解决方案1】:

这个设计有点有趣。

true 传递给tailcall 参数,将尝试在尾部位置调用方法作为lambda 主体内的尾部调用。

尾部位置是方法调用是返回表达式的位置。

至于更好,那是主观的。

  • 尾部调用往往总是较慢
  • 需要遵循一定的规则(返回类型必须匹配或者是引用)
  • 您没有用于调试的堆栈跟踪

【讨论】:

  • 你能解释一下为什么它会变慢吗?这是实施的 .net 问题吗?
  • 看到尾调用如何执行“goto”而不是函数调用,它应该更快,因为它不必将一大堆数据推送到堆栈上。这意味着它节省了将数据放入内存的时间,但它还在本地缓存中保留了相同的堆栈内存区域,从而避免了一些缓存未命中。
  • @CKoenig:在 CLR 2 上,方法调用开销约为正常调用的 7 倍。这是从开发需要适当尾递归的语言 (IronScheme) 的基准测试和个人经验中发现的。
  • @Gabe:您所指的是尾调用消除 (TCE),其中尾调用被转换为 while(true) { ... } 循环。这是一个非常常见的优化,存在尾调用。
  • @Ashley John:尾调用会在调用方法之前弹出堆栈。这就是为什么您无法通过正确的尾递归获得 stackoverflow 异常的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2019-08-26
相关资源
最近更新 更多