Я пытаюсь использовать функцию cartesianProduct из гуавы в программе scala. https://guava.dev/releases/19.0/api/docs/com/google/common/collect/Sets.html#cartesianProduct (java .util.List)
Функция cartesianProduct сама по себе молниеносна, но, похоже, я теряю много времени в преобразованиях между Java и Scala collection.
Например, если следующий код (хотя и не приличная попытка теста производительности) выполняется с двумя включенными комментариями, , то время в моем случае увеличивается в 700 раз ноутбук (~ 45 миллионов снимков до ~ 35000 миллис)
Что я могу сделать лучше?
import org.scalatest.BeforeAndAfter
import org.scalatest.diagrams.Diagrams
import org.scalatest.funspec.AnyFunSpecLike
import org.scalatest.matchers.should.Matchers
class CartesianProductTestStackOverFlow extends AnyFunSpecLike with Matchers with Diagrams with BeforeAndAfter {
describe("CartesianProductPerformanceTest") {
it("cartesian product perf test") {
val startTime = System.currentTimeMillis()
import com.google.common.collect.ImmutableSet
import com.google.common.collect.Sets._
import scala.jdk.CollectionConverters._
val cartProd//: Set[Seq[Int]] //UNCOMMENT TO SEE PERFORMANCE DROP
= cartesianProduct(ImmutableSet.copyOf((1 to 1000).asJava),
ImmutableSet.copyOf((1 to 100).asJava),
ImmutableSet.copyOf((1 to 100).asJava)
).asScala
//.map(javaList => javaList.asScala.toSeq).toSet //UNCOMMENT TO SEE PERFORMANCE DROP
assert(
cartProd
.size == 10000000
)
val totalTimeTaken = System.currentTimeMillis() - startTime
println(s"cartesianProductTailRec : Total time taken (millis) $totalTimeTaken")
}
}
}