3

我有一个很少有 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,我搜索了普通的 scala 支持的方法,但没有找到。

更新2:

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

所以,我需要其他方法来模拟 memcpy。

4

1 回答 1

1

由于用于的两个数组Array.copy都是原始整数数组(即不是其中一个持有装箱整数的情况,在这种情况下,while将使用装箱/拆箱循环来复制元素),它与爪哇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

于 2012-09-29T17:38:54.433 回答