我使用了带有Lift Json的Scala,并且运行良好。
当我用性能检查的虚拟数据进行测试时,我得到了不同的数字意味着不可比较。
这是我的性能检查
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)
请提供建议为什么它会这样显示。
有时系统性能也会对性能时间产生影响,我也认为。。但显示时相同
JVM是一个高度复杂的机器。它在执行代码时不断优化代码。只被调用几次的代码并没有像处于紧密内部循环中的代码那样得到优化。
结果是,您不能仅仅通过对代码块的执行进行计时来编写微基准测试。至少,您需要连续执行有问题的块几秒钟,以便即时编译器将注意力集中在它上并对其进行优化。这通常被称为预热。尝试使用适当的预热来进行基准测试,并使用更准确的System.nanoTime而不是System.currentTimeMillis,您将看到更常规的行为。
对于未来的测试,最好使用现有的基准测试框架。最著名的是谷歌卡尺,但有一个新的,特别是scala,它的侵入性和使用起来都要小得多。
下面的演讲涵盖了如何编写一个合适的微基准,还展示了一个新的微基准框架Rex Kerr 的性能设计
这是该项目的github站点百里香