1

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

我意识到以下代码:

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

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

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

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

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

4

1 回答 1

2

通常,隐式转换可能会对性能产生影响(例如,在很长一段时间内.isNaN比 慢约 50% java.lang.Double.isNaN)。但是,如果要转换为的类是值类,则 JIT 编译器可以更轻松地消除剩余的开销(通常没有;如果您有一个隐式转换使用另一个使用另一个等的隐式转换,您仍然可以保留一些开销。 --JIT 编译器在删除整个调用链之前放弃)。

无论如何,这不是这里的主要关注点。 intersect是一种通用方法,因此它将把字符串中的所有字符装箱。与定制设计为仅采用Char.

告诉这些事情的方法是查看 Scaladocs 并查看实现在哪里。 intersect不在叶子 ( StringOps) 中;它一直回到SeqLike,它对字符一无所知。(嗯,好吧,要确定你需要查看源代码和/或基准,但你通常可以从 Scaladoc 中列出的定义站点获得一个好主意。)

于 2013-09-25T17:43:37.187 回答