在下面的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,但也许有人可以了解影响这种情况的字节码优化的任何限制?
答案 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
版本按预期工作,即字节码已经优化。