performance - 在 Scala 中快速复制对象内容

标签 performance scala

我有一个包含很少 Int 和 Double 字段的类。将所有数据从一个对象复制到另一个对象的最快方法是什么?

class IntFields {
  private val data : Array[Int] = Array(0,0)

  def first : Int = data(0)
  def first_= (value: Int) = data(0) = value
  def second : Int = data(1)
  def second_= (value : Int) = data(1) = value

  def copyFrom(another : IntFields) =
    Array.copy(another.data,0,data,0,2)
}

这是我可能建议的方式。但我怀疑它是否真的有效,因为我对scala的内部结构没有清楚的了解

更新1:

事实上,我正在搜索 scala 的 c++ memcpy 等价物。我只需要一个简单的对象并逐字节复制它的内容。

数组复制只是一种 hack,我在 google 上搜索了普通的 scala 支持的方法,但没有找到。

更新2:

我尝试对两个持有者进行微基准测试:具有 12 个变量的简单案例类和一个用数组备份。在所有基准测试中(简单的复制和复杂的集合计算),基于数组的解决方案运行速度慢了大约 7%。

因此,我需要其他方法来模拟 memcpy。

最佳答案

因为用于 Array.copy 的两个数组都是原始整数数组(即其中一个数组不是装箱整数,在这种情况下 while带装箱/拆箱的循环将用于复制元素),它与 Java System.arraycopy 一样有效。也就是说 - 如果这是一个巨大的数组,您可能会看到与复制元素的 while 循环相比的性能差异。由于数组只有 2 个元素,因此这样做可能更有效:

def copyFrom(another: IntFields) {
  data(0) = another.data(0)
  data(1) = another.data(1)
}

编辑:

我会说最快的方法是逐个复制字段。如果性能真的很重要,您应该考虑使用 Unsafe.getInt - 一些报告说它应该比对小块使用 System.arraycopy 更快:https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe

关于performance - 在 Scala 中快速复制对象内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654700/

相关文章:

scala - SecureSocial : Running DB IO in a separate thread pool

Scala,直接从 super 构造函数调用中调用实例方法?

javascript - jQuery 的交换方法时间成本

asp.net - 如果我只是做一个查找表,我应该使用自动生成的主键吗?

c - 为什么 _mm512_store_pd 在这个矩阵乘法代码中 super 慢?

node.js - 为什么 chrome 审核中的 Node 与 lighthouse 这么慢?

asp.net-mvc - 使用 Web API 作为网站的数据提供者是否高效?

scala - 动态加载后,A 类无法转换为 A 类

scala - 为什么这个 Clojure 程序处理可变数组的速度如此之慢?

scala - 测试是否定义了方法