以下代码段在应用程序中被调用了几百万次,
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对。
有没有办法让它(甚至)更快?
答案 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 &&
,因为您已经确定两者都不是真的(在上面测试过)。但是,优化器也可能会注意到这一点并为您删除代码,因此我怀疑它会影响性能。