Scala函数值部分评估歧义(内联?)

时间:2016-11-22 19:20:04

标签: scala optimization functional-programming expression bytecode

在下面的Scala片段中,我尝试确保尽可能多的表达式"预编译"因此函数文字的最终完整应用会产生尽可能少的cpu周期。即,我想确保在函数 - 文字赋值时评估if条件,而不是在将函数文字应用于未绑定参数时进行评估。

typeInfo.GetTypeAttr()

我想要的是然后多次应用功能文字,比如     tokenFilterFactory(的TokenStream)

我的问题:每当函数文字被应用(坏)时,是否会执行条件private val tokenFilterFactory: TokenStream => TokenStream = if(augment) { new AugmentingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory()) } else { new ReplacingStemmingTokenFilter(_, markStems, bitPos, stemmerFactory()) } ,或者在定义/分配函数文字时,它是否只执行一次?上下文:scala 2.11

等效地,上面的val赋值运行时等效(仅w.r.t。评估,而不是'赋值性')到以下片段:

if(augment)

也就是说,我希望前面的代码像后者一样行事。情况已经是这样了吗?

我意识到我可以尝试使用一些printlns,但也许有人可以了解影响这种情况的字节码优化的任何限制?

1 个答案:

答案 0 :(得分:0)

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版本按预期工作,即字节码已经优化。