Scala中的性能注意事项

时间:2013-09-25 17:00:33

标签: scala

Scala依赖java.lang.String进行字符串操作,但是,它通过添加其他方法(如.intersect等)来丰富java字符串类。 对于java中的int包装器(Int)也是如此,还有RichInt类。

我意识到以下代码:

val stringOne: String = "teststring"
val stringTwo: String = "string"
stringOne.intersect(stringTwo)

将导致scala编译器将stringOne转换为StringOps类,以便它可以访问方法intersect

我担心这会导致严重的计算成本 那么有人能告诉我这是否属实,如果是,有没有办法优化或避免这种情况?

我希望我的问题有道理,我已阅读了几本书,但没有一本能解决这些问题 谢谢。 :)

编辑: 已经提出并回答了类似的问题here 如果有人能从记忆角度解决这个问题,我将不胜感激

1 个答案:

答案 0 :(得分:2)

通常,隐式转换可能会对性能产生影响(例如,.isNaNjava.lang.Double.isNaN慢约50%。但是,如果转换为的类是一个值类,那么JIT编译器可以更容易地删除剩余的开销(通常没有;如果你有一个隐式转换使用另一个使用另一个隐式转换,你仍然可以保留一些开销。 - JIT编译器在删除整个调用链之前放弃了。

无论如何,这不是主要关注的问题。 intersect是一种通用方法,因此它将包装字符串中的所有字符。与定制设计为仅Char的方法相比,这将大大减慢(可能是5倍左右)。

告诉这些事情的方法是浏览Scaladocs并查看实现的位置。叶子中没有intersectStringOps);它一直追溯到SeqLike,它对角色一无所知。 (好吧,好吧,确实你需要查看源代码和/或基准测试,但是你通常可以从Scaladoc中列出的定义站点中获得一个好主意。)