java - 从 java 到 scala 集合的隐式转换成本

标签 java scala performance collections type-conversion

我想知道从 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/

相关文章:

java - AmazonKinesisClient 构造函数已弃用

java - 即使数据库已关闭,Spring 应用程序也应该启动

Scala 模式匹配变量绑定(bind)

scala - 刷新 twitter finagle 库中的 DNS 缓存

MySQL SELECT 非常慢,因为 LONGBLOB

ruby-on-rails - 如何加快 Rails 延迟作业的启动时间?

performance - W3C 限制 DTD/XSD 请求;有镜像或文件列表吗?

java - 如何在Oracle中选择当月的记录?

java - 为什么 Google Cloud API 会尝试以最终用户身份进行连接?

scala - 使用 Build.scala 进行交叉编译时,如何为每个 Scala 版本设置不同的 scalacOptions?