【问题标题】:Scala function-value partial evaluation ambiguity (inlining?)Scala函数值部分评估歧义(内联?)
【发布时间】:2017-04-06 14:35:01
【问题描述】:

在下面的 Scala sn-p 中,我尝试确保尽可能多的表达式是“预编译的”,以便函数字面量的最终完整应用会产生尽可能少的 cpu 周期。即,我想确保在函数文字赋值时而不是稍后在将函数文字应用于未绑定参数时评估 if 条件。

private val tokenFilterFactory: TokenStream => TokenStream = 
  if(augment) {
    new AugmentingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory())
  }
  else {
    new ReplacingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory())
  }

我想要的是大量应用函数文字,比如 tokenFilterFactory(tokenStream)

我的问题:条件 if(augment) 会在每次应用函数文字时执行(不好),还是在定义/分配函数文字时只执行一次?上下文:scala 2.11

等效地,上述 val-assignment 运行时等效于以下 sn-p:

private var tokenFilterFactory: TokenStream => TokenStream = _
if(augment) {
  tokenFilterFactory = new AugmentingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory())
}
else {
  tokenFilterFactory = new ReplacingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory())
}

也就是说,我希望前一个代码的行为类似于后者。已经是这样了吗?

我意识到我可以用一些 println 来尝试一下,但也许有人可以阐明影响这种情况的字节码优化的任何限制?

【问题讨论】:

  • “我知道我可以试一试”!
  • 感谢您的鼓励 :-)

标签: scala optimization functional-programming expression bytecode


【解决方案1】:
def condition(): Boolean = {
  println("conditional evaluated")
  true
}
private val intModifier: Int => Int =
  if(condition()) {
    _ + 1
  } else {
    _ - 1
  }

intModifier(1)
intModifier(2)

输出:

condition: condition[]() => Boolean



conditional evaluated
intModifier: Int => Int = <function1>


res0: Int = 2
res1: Int = 3

所以val 版本按预期工作,即字节码已经优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多