scala - 为什么 Scala 初始化元组数组很慢?

标签 scala performance

这是缓慢的代码

object Hello {
  def main(args: Array[String]) = {
    val ret = Array.fill[(Int, Int, Int)](8000000){(0, 0, 0)}
    println(ret.size)
  }
}

运行时间为 2 分钟。然后输出

java.lang.OutOfMemoryError: GC overhead limit exceeded

这是快速代码

object Hello {
  def main(args: Array[String]) = {
    val ret = Array.fill[Int](24000000){0}
    println(ret.size)
  }
}

运行 0.5 秒。

我的编译选项:

scalac Hello.scala

为什么差距这么大?

最佳答案

Array[Int] 是基元数组。

Array[(Int, Int, Int)] 是一个对象数组。

(您可以尝试使用 Array[java.lang.Integer],它也是一个对象数组。)


通常情况下,您的设置有问题

object Hello {
  def main(args: Array[String]) = {
    val ret = Array.fill[(Int, Int, Int)](8000000){(0, 0, 0)}
    println(ret.size)
  }
}

不需要很长时间https://scastie.scala-lang.org/4p4GpYbHSqm7K6U3hwLdYw

关于scala - 为什么 Scala 初始化元组数组很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62924191/

相关文章:

performance - 如何从相对较大的 Spark 数据框中获取最高百分比并将其保存到文件中

performance - 缓存相关的性能优化技术?

scala - 理解 Scala 中的 IO-monad

scala - Gatting scala 脚本随机化场景

json - Play : validate JSON with a field with possible multiple types

.net - .NET 4.0 中的 Array.Sort() 发生了什么? TrySZSort() 消失了吗?

scala - 带有对象键的记录的 Circe 通用编解码器推导

Scala/Slick 3.0.1 - 更新多列

Android - 我如何调查 ANR?

python - 在具有不同重数但相同维度的数组上同时使用 numpy repeat