【问题标题】:Performance Considerations In Scala [duplicate]Scala 中的性能注意事项 [重复]
【发布时间】:2013-09-25 17:00:32
【问题描述】:

Scala 的 String 操作依赖于 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 如果有人也能从记忆的角度解决这个问题,我将不胜感激

【问题讨论】:

  • 你听说过隐式转换吗?如果不是 - 我建议您阅读主题,它与您的问题有关。
  • 我知道隐式转换是由编译器处理的,而无需您自己在代码中进行,例如在 java Employer em = new Employee(); Manager mg = (Manager) em 是显式转换。没有?

标签: scala


【解决方案1】:

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

无论如何,这不是这里的主要问题。 intersect 是一种通用方法,因此它会将字符串中的所有字符装箱。与专门设计为仅采用 Char 的方法相比,这将大大减慢速度(可能是 5 倍左右)。

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

【讨论】:

  • 我也应该担心内存使用吗?
  • 使用装箱可能(如果 JVM 无法忽略创建)需要大量垃圾收集。
猜你喜欢
  • 2011-07-09
  • 2017-01-24
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多