Что более эффективно для объединения двух последовательностей в одну: `seq1 ++ seq2` или Seq (seq1, seq2) .flatten - PullRequest
1 голос
/ 11 марта 2020

Топи c. Я знаю, что ++ может столкнуться с некоторыми очень медленными проблемами с производительностью при работе с очень большими последовательностями данных. Seq (seq1, seq2) .flatten лучше? Или есть третий вариант, который я не рассматриваю, например, union, concat, et c.

Спасибо!

1 Ответ

3 голосов
/ 12 марта 2020

Внимай sbt-jmh совет

"Не доверяй никому, все на скамейке".

таким образом

sbt "jmh:run -i 10 -wi 5 -f 2 -t 1 bench.So60643849"

где

@State(Scope.Benchmark)
@BenchmarkMode(Array(Mode.Throughput))
class So60643849 {
  val size = 1000000
  val seq = Seq.fill(size)(42)

  @Benchmark def ++(): Seq[Int] = seq ++ seq
  @Benchmark def flatten(): Seq[Int] = Seq(seq, seq).flatten
}

дает с Scala 2.13.1, который по умолчанию имеет List в качестве конкретной реализации Seq

[info] Benchmark               Mode  Cnt   Score   Error  Units
[info] So60643849.$plus$plus  thrpt   20  94.436 ± 4.928  ops/s
[info] So60643849.flatten     thrpt   20  52.070 ± 6.549  ops/s

, поэтому seq1 ++ seq2 кажется быстрее. Кроме того, IMO, намерение кажется более ясным, чем Seq(seq1, seq2).flatten.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...