Scala if-else效率提升

时间:2014-06-18 10:10:43

标签: performance scala if-statement

以下代码段在应用程序中被调用了几百万次,

val res = myArray.map { case (expr1,expr2) =>
  val nan1 = expr1.isNaN
  val nan2 = expr2.isNaN

  if (nan1 && nan2) 0.0
  else if (nan1  && !nan2) expr2
  else if (!nan1 && nan2) expr1
  else expr1-expr2
}

其中myArray通常包含100到1000对。

有没有办法让它(甚至)更快?

2 个答案:

答案 0 :(得分:2)

如果这是 性能瓶颈,请考虑在一对数组上使用相应基本类型(Double?)的一对数组,并写一个好的旧{{1如@wingedsubmariner建议的那样循环。

为了回答你原来的问题,假设NaN是罕见的,你可以通过重新排序if-elses来获得边际加速,以便首先识别最常见的情况,尤其是因为分支预测:

while

或者也许:

if (!nan1 && !nan2) expr1-expr2
else if (nan1) if (!nan2) expr2 else 0.0
else expr1

但您可能需要将此代码段缩减为微基准版并使用类似JMH的内容进行衡量,以发现差异。

答案 1 :(得分:0)

您可以省略&&!nan2!nan1 &&,因为您已经确定两者都不是真的(在上面测试过)。但是,优化器也可能会注意到这一点并为您删除代码,因此我怀疑它会影响性能。