потеря производительности в scala .jdk.CollectionConverters - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь использовать функцию 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")
    }
  }
}

...