У меня есть два массива (которые я вытащил из матрицы (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
}
Результаты, которые, как мне казалось, я получил в первый раз, были прямо противоположными... Должно быть, я неправильно понял или перепутал методы.
Мои извинения за некорректный вопрос.