为什么通过扁平迭代器迭代缓慢?

时间:2017-11-29 00:20:26

标签: performance scala collections jmh

Scala 2.11.8

我通过扁平和非扁平迭代器测量迭代。我写了以下基准:

@State(Scope.Benchmark)
class SerializeBenchmark
  var list = List(
    List("test", 12, 34, 56),
    List("test-test-test", 123, 444, 0),
    List("test-test-test-tes", 145, 443, 4333),
    List("testdsfg-test-test-tes", 3145, 435, 333),
    List("test-tessdfgsdt-tessdfgt-tes", 1455, 43, 333),
    List("tesewrt-test-tessdgdsft-tes", 13345, 4533, 3222333),
    List("ewrtes6yhgfrtyt-test-test-tes", 122245, 433444, 322233),
    List("tserfest-test-testtryfgd-tes", 143345, 43, 3122233),
    List("test-reteytest-test-tes", 1121145, 4343, 3331212),
    List("test-test-ertyeu6test-tes", 14115, 4343, 33433),
    List("test-lknlkkn;lkntest-ertyeu6test-tes", 98141115, 4343, 33433),
    List("tkknknest-test-ertyeu6test-tes", 914111215, 488343, 33433),
    List("test-test-ertyeu6test-tes", 1411125, 437743, 93433),
    List("test-test-ertyeu6testo;kn;lkn;lk-tes", 14111215, 5409343, 39823),
    List("telnlkkn;lnih98st-test-ertyeu6test-tes", 1557215, 498343, 3377433)
  )

  @Benchmark
  @OutputTimeUnit(TimeUnit.NANOSECONDS)
  @BenchmarkMode(Array(Mode.AverageTime))
  def flattenerd(bh: Blackhole): Any = {
    list.iterator.flatten.foreach(bh.consume)
  }

  @Benchmark
  @OutputTimeUnit(TimeUnit.NANOSECONDS)
  @BenchmarkMode(Array(Mode.AverageTime))
  def raw(bh: Blackhole): Any = {
    list.iterator.foreach(_.foreach(bh.consume))
  }
}

在多次运行这些基准测试后,我得到了以下结果:

Benchmark                      Mode  Cnt      Score      Error  Units
SerializeBenchmark.flattenerd  avgt    5  10311,373 ± 1189,448  ns/op
SerializeBenchmark.raw         avgt    5   3463,902 ±  141,145  ns/op

性能差异近3倍。更大的我使源list具有更大的性能差异。为什么呢?

我预计会有一些性能差异但不是3次。

0 个答案:

没有答案