我想知道从 java 集合隐式转换到 scala 集合的成本。在 this doc有几种隐式双向转换,据说“从源类型转换为目标类型并再次转换回来将返回原始源对象”。
我的结论是成本应该很小(包装),但它仍然是多少?
我问这个问题是因为我在某些 Scala 代码中使用了 Java 集,当我导入 asScalaSet
时它被隐式转换为 Scala 集(我在某些地方确实需要它)。但是,对于非常小的访问器(例如 size()
有人知道吗?
最佳答案
我决定从实际角度回答您的问题。我使用以下简单的 JMH 基准来测试原始 scala 集合的每秒操作数并转换一个(使用隐式转换)。
请找到以下基准代码:
import org.openjdk.jmh.annotations._
import scala.collection.JavaConversions._
@State(Scope.Thread)
class WrapperBenchmark {
val unwrappedCollection = (1 to 100).toSet
val wrappedCollection: java.util.Set[Int] = (1 to 100).toSet[Int]
@Benchmark
def measureUnwrapped: Int = unwrappedCollection.size
@Benchmark
def measureWrapped: Int = wrappedCollection.size()
}
我使用了 sbt 和 sbt-jmh 插件来运行。请在下面找到结果:
[info] Benchmark Mode Cnt Score Error Units
[info] WrapperBenchmark.measureUnwrapped thrpt 200 353214968.844 ± 1534779.932 ops/s
[info] WrapperBenchmark.measureWrapped thrpt 200 284669396.241 ± 4223983.126 ops/s
所以基本上根据结果,确实有开销。我将尝试继续我的研究,在稍后更新此问题时提供原因。
如果您希望我为您 future 的研究分享完整的 sbt 项目,请告诉我。
关于java - 从 java 到 scala 集合的隐式转换成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31830028/