Go vs JavaScript JSON 解析

问题描述 投票:0回答:2

最近,我需要解析 Chrome Web 浏览器在开发工具中记录事件时生成的 JSON,并从中获取一些计时数据。 Chrome 可以在短时间内产生相当大量的数据,因此我最初构建的 Ruby 解析器相当慢。

自从我学习 Go 以来,我决定用 Go 和 JavaScript/Node 编写脚本并进行比较。

JSON 文件的最简单形式就是我在this 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

在 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 解析 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

使用 Go,您可以将 JSON 解析为静态类型的结构。使用 JS 和 Ruby,您可以将其解析为哈希表。
javascript node.js go
2个回答
10
投票

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

默认的 Go JSON 解析速度非常慢。我用 5M json 文件对其进行了基准测试。


0
投票
encoding/json

2024/01/07 21:58:47 UnMarshal: 54.60 ms 2024/01/07 21:58:47 Marshal: 13.70 ms

NodeJS

JSON.parse took 16.12 milliseconds.
JSON.stringify took 30.06 milliseconds.

不过,您可以使用 Go 语言中的替代模块,它们提供与 NodeJS 相同的性能。

Go 的 
https://github.com/goccy/go-json

2024/01/07 22:06:27 UnMarshal: 17.45 ms 2024/01/07 22:06:27 Marshal: 10.80 ms

© www.soinside.com 2019 - 2024. All rights reserved.