【发布时间】:2012-03-05 10:45:47
【问题描述】:
我正在运行以下 Scala 代码:
import scala.util.parsing.json._
import scala.io._
object Main {
def jsonStringMap(str: String) =
JSON.parseFull(str) match {
case Some(m: Map[_,_]) => m collect {
// If this doesn't match, we'll just ignore the value
case (k: String, v: String) => (k,v)
} toMap
case _ => Map[String,String]()
}
def main(args: Array[String]) {
val fh = Source.fromFile("listings.txt")
try {
fh.getLines map(jsonStringMap) foreach { v => println(v) }
} finally {
fh.close
}
}
}
在我的机器上,http://sortable.com/blog/coding-challenge/ 的文件大约需要 3 分钟。我编写的等效 Haskell 和 Ruby 程序只用了不到 4 秒。我做错了什么?
我尝试了没有 map(jsonStringMap) 的相同代码,它非常快,那么 JSON 解析器真的很慢吗?
默认的 JSON 解析器似乎确实很慢,但是我尝试了 https://github.com/stevej/scala-json,虽然这将其缩短到 35 秒,但仍然比 Ruby 慢得多。
我现在使用的是https://github.com/codahale/jerkson,它更快!我的程序现在在我的数据上运行只需 6 秒,仅比 Ruby 慢 3 秒,这可能只是 JVM 启动。
【问题讨论】:
-
也许更适合 codereview.stackexchange.com
-
副手,似乎您正在独立解析每一行。您是否尝试过为整个 JSON 文档调用一次解析器?
-
我很确定答案只是“没有人费心编写快速 JSON 解析器”。解析器组合器(JSON 解析器就是其中之一)是为了易于创建,而不是性能。如果您想要速度,最好使用 Java JSON 库。
-
提升 json 必须很快,正如这个问题的答案中所引用的 stackoverflow.com/questions/927983/…
-
好吧,如果我们能看到 Ruby/Haskell 程序就更容易回答了。
标签: json performance scala