我有两个数组(我已经从矩阵中提取出来(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
}
我需要这样做数十亿次,所以速度的任何改进都是一个加分项。
我曾尝试使用 aList
而不是 anArray
来收集差异,它要快得多,但是当我将它转换回Array
.
我确实修改了下游代码以List
查看是否有帮助,但我需要无序访问列表的内容,因此再次失去任何收益。
似乎将一种类型转换为另一种类型都很昂贵,我想知道是否有某种方法可以更快地使用地图等。
有没有更好的办法?
编辑
不知道我第一次做了什么!?
所以我用来测试它的代码是这样的:
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
}
我认为我第一次这样做时得到的结果完全相反......我一定是误读或混淆了方法。
我很抱歉问了一个不好的问题。