快速复制scala中的对象内容

时间:2012-09-29 17:13:30

标签: 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的内部结构没有明确的理解

UPDATE1:

实际上我正在搜索scala相当于c ++ memcpy的东西。我只需要取一个简单的对象并逐字节地复制它。

数组复制只是一个黑客攻击,我用谷歌搜索正常的scala支持方法,但没有找到。

UPDATE2:

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

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

1 个答案:

答案 0 :(得分:1)

由于用于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