我有一个包含很少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的内部结构没有明确的理解
实际上我正在搜索scala相当于c ++ memcpy的东西。我只需要取一个简单的对象并逐字节地复制它。
数组复制只是一个黑客攻击,我用谷歌搜索正常的scala支持方法,但没有找到。
我试过微支持两个持有者:简单的案例类有12个变量,一个用数组备份。在所有基准测试中(简单复制和基于集合的复杂计算),基于阵列的解决方案的工作速度较慢,约为7%。
所以,我需要其他方法来模拟memcpy。
答案 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