去vs JavaScript JSONparsing

最近,我需要parsingChrome浏览器在其开发工具中logging事件时产生的JSON,并从中获取一些定时数据。 Chrome可以在很短的时间内产生相当多的数据,所以我最初构build的Rubyparsing器非常慢。

由于我在学习Go,所以我决定在Go和JavaScript / Node中编写脚本并对它们进行比较。

JSON文件的最简单forms就是我在这个Gist中所使用的forms 。 它包含一个事件,表示发送到一个页面的请求,以及表示响应的事件。 通常情况下,需要筛选大量的额外数据。 这是它自己的问题,但不是我在这个问题上担心的。

我写的JavaScript脚本就在这里 ,我写的Go程序就在这里 。 这是我在Go中写的第一个有用的东西,所以我确定它是各种各样的。 不过,我注意到的一件事是,在parsing一个大的JSON文件时,它比JavaScript慢得多。

在Go中有119Mb的JSON文件的时间:

$ time ./parse data.json = 22 Requests Min Time: 0.77 Max Time: 0.77 Average Time: 0.77 ./gm data.json 4.54s user 0.16s system 99% cpu 4.705 total 

JavaScript / Node中的119Mb JSON文件的时间:

 $ time node parse.js data.json = 22 Requests Min Time: 0.77 Max Time: 0.77 Avg Time: 0.77 node jm.js data.json 1.73s user 0.24s system 100% cpu 1.959 total 

(在这个例子中,最小/最大/平均时间都是相同的,因为我复制了JSON对象,以便有一个非常大的数据集,但这是不相关的。)

我很好奇,如果只是JavaScript / Node在parsingJSON方面速度更快(我想这不会特别令人惊讶),或者如果在Go程序中有什么我完全错误的。 我也只是好奇我在Go程序中做错了什么,因为我确信它有很多错误。

请注意,虽然这两个脚本不仅仅是parsing,但是它肯定是在程序中添加大量时间的json.Unmarshal()

更新

我添加了一个Ruby脚本 :

 $ ruby parse.rb = 22 Requests Min Time: 0.77 Max Time: 0.77 Avg Time: 0.77 ruby parse.rb 4.82s user 0.82s system 99% cpu 5.658 total 

使用Go,您将JSONparsing为静态types的结构。 用JS和Ruby,你正在把它parsing成哈希表。

为了将JSONparsing到您定义的结构中,json包需要查找其字段的名称和types。 要做到这一点,它使用reflection包,这比直接访问这些字段慢得多。

根据你在parsing数据后做了什么,额外的parsing时间可能会为自己付出代价。 Go数据结构比哈希表使用更less的内存,访问速度更快。 因此,如果您对数据做了很多工作,处理时间的节省可能会超过额外的parsing时间。