最近,我需要解析Chrome Web浏览器在其开发工具中记录事件时生成的JSON,并从中获取一些时间数据。Chrome可以在很短的时间内产生大量数据,因此我最初构建的Ruby解析器非常慢。
由于我正在学习Go,所以我决定编写Go和JavaScript/Node脚本并进行比较。
JSON文件的最简单形式是我在this Gist中拥有的内容。它包含代表发送到获取页面的请求的事件和代表响应的事件。通常,有大量额外的数据需要筛选。这是一个问题,但不是我在这个问题中担心的问题。
我写的JavaScript脚本在这里,我写的Go程序在这里。这是我用Go写的第一个有用的东西,所以我确定它肯定存在各种问题。但是,我注意到的一件事情是,在解析大型JSON文件方面,它比JavaScript要慢得多。
在这个例子中,最小/最大/平均时间都是相同的,因为我复制了JSON对象以获得非常大的数据集,但这与问题无关。
我很好奇,是JavaScript / Node仅仅比Go更快地解析JSON(这并不特别令人惊讶),还是我在Go程序中做错了什么。此外,我也很好奇我在一般情况下在Go程序中做错了什么,因为我确定它有很多错误。
请注意,虽然这两个脚本做了更多的工作,但在程序中肯定是Go的json.Unmarshal()增加了很多时间。
更新:
我添加了一个Ruby脚本:
由于我正在学习Go,所以我决定编写Go和JavaScript/Node脚本并进行比较。
JSON文件的最简单形式是我在this Gist中拥有的内容。它包含代表发送到获取页面的请求的事件和代表响应的事件。通常,有大量额外的数据需要筛选。这是一个问题,但不是我在这个问题中担心的问题。
我写的JavaScript脚本在这里,我写的Go程序在这里。这是我用Go写的第一个有用的东西,所以我确定它肯定存在各种问题。但是,我注意到的一件事情是,在解析大型JSON文件方面,它比JavaScript要慢得多。
使用119Mb的JSON文件时在Go中的时间:
$ 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仅仅比Go更快地解析JSON(这并不特别令人惊讶),还是我在Go程序中做错了什么。此外,我也很好奇我在一般情况下在Go程序中做错了什么,因为我确定它有很多错误。
请注意,虽然这两个脚本做了更多的工作,但在程序中肯定是Go的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
JSON.parse()
或Go的json.unMarshal()
时发生的。其余工作只是遍历生成的数据结构。 - Pointyjson.Unmarshal()
比 JavaScript 中的JSON.parse()
慢得多(或者看起来是这样)。你是对的,在某些地方我应该使用不同的动词。 :) - clem