2つの配列(行列から引き出した配列(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
それが役立つかどうかを確認しましたが、リストの内容に順不同でアクセスする必要があるため、ここでもゲインが失われます。
あるタイプから別のタイプへの変換には費用がかかるようです。もっと速い地図などを使用する方法があるのではないかと思います。
もっと良い方法はありますか?
編集
初めて何をしたのかわからない!?
だから私がそれをテストするために使用したコードはこれでした:
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
}
これを初めて行ったときに得たと思った結果は正反対でした...私は方法を読み間違えたか、混同したに違いありません。
悪い質問をしてしまったことをお詫びします。