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 如果有人能从记忆角度解决这个问题,我将不胜感激
答案 0 :(得分:2)
通常,隐式转换可能会对性能产生影响(例如,.isNaN
比java.lang.Double.isNaN
慢约50%。但是,如果转换为的类是一个值类,那么JIT编译器可以更容易地删除剩余的开销(通常没有;如果你有一个隐式转换使用另一个使用另一个隐式转换,你仍然可以保留一些开销。 - JIT编译器在删除整个调用链之前放弃了。
无论如何,这不是主要关注的问题。 intersect
是一种通用方法,因此它将包装字符串中的所有字符。与定制设计为仅Char
的方法相比,这将大大减慢(可能是5倍左右)。
告诉这些事情的方法是浏览Scaladocs并查看实现的位置。叶子中没有intersect
(StringOps
);它一直追溯到SeqLike
,它对角色一无所知。 (好吧,好吧,确实你需要查看源代码和/或基准测试,但是你通常可以从Scaladoc中列出的定义站点中获得一个好主意。)