gpt4 book ai didi

scala - 在scala中减去两个数组的最快方法是什么

转载 作者:行者123 更新时间:2023-12-04 14:47:21 26 4
gpt4 key购买 nike

我有两个数组(我已经从矩阵 (Array[Array[Int]]) 中拉出),我需要从另一个中减去一个。

然而,目前我正在使用这种方法,当我分析它时,它是瓶颈。

def subRows(a: Array[Int], b: Array[Int], sizeHint: Int): Array[Int] = {
val l: Array[Int] = new Array(sizeHint)
var i = 0
while (i < sizeHint) {
l(i) = a(i) - b(i)
i += 1
}
l
}

我需要这样做数十亿次,所以速度的任何改进都是加分项。

我曾尝试使用 List而不是 Array收集差异,它要快得多,但是当我将其转换回 Array 时,我失去了所有好处。 .

我确实修改了下游代码以获取 List看看这是否会有所帮助,但我需要无序访问列表的内容,因此再次失去任何 yield 。

似乎任何一种类型到另一种类型的转换都是昂贵的,我想知道是否有某种方法可以使用 map 等可能更快。

有没有更好的办法?

编辑

不知道我第一次做了什么!?

所以我用来测试它的代码是这样的:
def subRowsArray(a: Array[Int], b: Array[Int], sizeHint: Int): Array[Int] = {
val l: Array[Int] = new Array(sizeHint)
var i = 0
while (i < sizeHint) {
l(i) = a(i) - b(i)
i += 1
}
l
}

def subRowsList(a: Array[Int], b: Array[Int], sizeHint: Int): List[Int] = {
var l: List[Int] = Nil
var i = 0
while (i < sizeHint) {
l = a(i) - b(i) :: l
i += 1
}
l
}

val a = Array.fill(100, 100)(scala.util.Random.nextInt(2))
val loops = 30000 * 10000

def runArray = for (i <- 1 to loops) subRowsArray(a(scala.util.Random.nextInt(100)), a(scala.util.Random.nextInt(100)), 100)

def runList = for (i <- 1 to loops) subRowsList(a(scala.util.Random.nextInt(100)), a(scala.util.Random.nextInt(100)), 100)

def optTimer(f: => Unit) = {
val s = System.currentTimeMillis
f
System.currentTimeMillis - s
}

我认为我第一次这样做的结果恰恰相反......我一定是误读或混淆了方法。

我很抱歉问了一个不好的问题。

最佳答案

该代码是您可以使用标准 JVM 管理单线程的最快代码。如果您认为 List速度更快,您要么在自欺欺人,要么实际上没有告诉我们您在做什么。放一个 Int进入 List需要创建两个对象:一个用于创建列表元素,另一个用于装箱整数。创建对象所需的时间大约是访问数组的 10 倍。所以以任何其他方式来做这件事真的不是一个成功的提议。

如果您真的,真的需要更快,并且必须使用单个线程,您可能应该切换到 C++ 或类似的,并明确使用 SSE 指令。见 this question , 例如。

如果您真的,真的需要更快并且可以使用多个线程,那么最简单的方法是打包一大块这样的工作(即需要减去的合理数量的向量对 - 可能至少有几百万每个块的元素)放入一个列表,只要你机器上的处理器数量,然后调用 list.par.map(yourSubtractionRoutineThatActsOnTheChunkOfWork) .

最后,如果你可以是破坏性的,

a(i) -= b(i)

内循环当然更快。同样,如果您可以重用空间(例如使用 System.arraycopy ),那么比必须继续分配空间更好。但这会改变您所显示的界面。

关于scala - 在scala中减去两个数组的最快方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940892/

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