gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:55:56 25 4
gpt4 key购买 nike

我有一个包含很少 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com