0

我将 Scala 与 Lift-Json 一起使用并且工作正常。

当我使用虚拟数据进行性能检查时,我得到的不同数字意味着无法比较。

这是我的性能检查

Data in Rows    Weight    ForRead (ms)  Parse (ms)
10000           468.9 KB    55            441
20000           948.9 kb    96            544
30000            1.4 MB     97            563
**40000          1.9 MB    127            908**
50000            2.4 MB     90            990
100000           4.8 mb    115           1500

当我每次使用 40k 行虚拟数据时,它显示 127-140 毫秒来读取数据,但如果我使用 50K 行,它会下降到 85-90 毫秒。

请检查我的代码一次 - 在这里

implicit val formats = net.liftweb.json.DefaultFormats

val map = {
  val mb = new scala.collection.mutable.HashMap[String, Any]() with scala.collection.mutable.SynchronizedMap[String, Any]
  (1 to 40000).foreach { i =>

       mb += "dummy%s".format(i) -> List("cat1", "hash1", 100, (System.currentTimeMillis()/1000).toInt) 
  }
  mb.toMap
}

//val json1 = map.toString
val json = Extraction.decompose(map)

val jsonStrOut = Printer.pretty(JsonAST.render(json))
val fileName = "foo3.txt"

val fw = new FileWriter(fileName)
fw.write(jsonStrOut)
fw.close()
val t1 = System.currentTimeMillis()
val br : BufferedReader = new BufferedReader(new FileReader(fileName));
    val sb:StringBuilder = new StringBuilder();
      var line = br.readLine();

       while (line != null) {
           sb.append(line);
           sb.append("\n");
           line = br.readLine();
       }
       val content = sb.toString();
       br.close()


println(System.currentTimeMillis() - t1)

val obj = parse(content).asInstanceOf[JObject].values

println(System.currentTimeMillis() - t1)
println(obj("dummy4"))
     println(System.currentTimeMillis() - t1)

请提供建议,为什么它会这样显示。

有时系统性能也会显示对性能时间的影响,我认为也是..但同样显示

4

1 回答 1

1

JVM 是一个高度复杂的机器。它在执行时不断优化您的代码。只被调用几次的代码没有像处于紧密内部循环中的代码那样得到优化。

结果是您不能只通过对代码块的执行计时来编写微基准测试。至少你需要连续执行有问题的块几秒钟,以便及时编译器将注意力集中在它上并优化它。这通常称为热身。尝试使用适当的预热并使用更准确的 System.nanoTime 而不是 System.currentTimeMillis 进行基准测试,您将看到更规律的行为。

对于未来的测试,您最好使用现有的基准测试框架。最著名的是 google caliper,但是有一个新的,特别是针对 scala 的,它的侵入性和古怪的使用要少得多。

这是一个演讲,涵盖了如何编写适当的微基准测试,还展示了一个新的微基准测试框架 Rex Kerr 为性能而设计

这里是 Thyme项目的 github 站点

于 2013-07-13T08:01:53.287 回答