Go vs JavaScript JSON解析

cle*_*lem 7 javascript go node.js

最近,我需要解析当您在其开发工具中记录事件时Chrome网络浏览器生成的JSON,并从中获取一些时序数据.Chrome可以在很短的时间内生成大量数据,因此我最初构建的Ruby解析器非常慢.

因为我正在学习Go,所以我决定在Go和JavaScript/Node中编写脚本并进行比较.

最简单的JSON文件形式就是我在这个Gist中所拥有的.它包含表示发送以获取页面的请求的事件,以及表示响应的事件.通常情况下,有一个巨大的额外数据中进行筛选的量.这是它自己的问题,但不是我在这个问题上担心的问题.

我写的JavaScript脚本就在这里,我写的Go程序就在这里.这是我在Go中写的第一个有用的东西,所以我确定它有各种各样的不好.然而,有一两件事我注意到的是,它的多少在解析大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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

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

请注意,虽然这两个脚本不仅仅是解析,但它肯定 json.Unmarshal()在Go中增加了很多时间.

更新

我添加了一个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
Run Code Online (Sandbox Code Playgroud)

and*_*olm 10

使用Go,您将JSON解析为静态类型的结构.使用JS和Ruby,您将其解析为哈希表.

为了将JSON解析为您定义的结构,json包需要找出其字段的名称和类型.为此,它使用反射包,这比直接访问这些字段要慢得多.

根据解析后对数据执行的操作,额外的解析时间可能会收回成本.Go数据结构比哈希表使用更少的内存,并且访问速度更快.因此,如果您对数据做了大量工作,处理时间的节省可能会超过额外的解析时间.