Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go vs JavaScript JSON解析_Javascript_Node.js_Go - Fatal编程技术网

Go vs JavaScript JSON解析

Go vs JavaScript JSON解析,javascript,node.js,go,Javascript,Node.js,Go,最近,我需要解析ChromeWeb浏览器在其开发工具中记录事件时生成的JSON,并从中获取一些计时数据。Chrome可以在很短的时间内生成大量的数据,因此我最初构建的Ruby解析器相当慢 因为我在学习Go,所以我决定用Go和JavaScript/Node编写脚本,并对它们进行比较 JSON文件最简单的可能形式是我的。它包含一个表示为获取页面而发送的请求的事件,以及一个表示响应的事件。通常,需要筛选大量的额外数据。这是它自己的问题,但不是我在这个问题上担心的 我写的JavaScript脚本是,我写

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

因为我在学习Go,所以我决定用Go和JavaScript/Node编写脚本,并对它们进行比较

JSON文件最简单的可能形式是我的。它包含一个表示为获取页面而发送的请求的事件,以及一个表示响应的事件。通常,需要筛选大量的额外数据。这是它自己的问题,但不是我在这个问题上担心的

我写的JavaScript脚本是,我写的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
(在本例中,min/max/average时间都是相同的,因为我复制了JSON对象以获得非常大的数据集,但这与此无关。)

我很好奇是否只是JavaScript/Node解析JSON的速度快了很多(我想这不会特别令人惊讶),或者是我在Go程序中做了一些完全错误的事情。我也很好奇我在围棋程序中犯了什么错误,因为我确信它有很多错误

请注意,虽然这两个脚本所做的不仅仅是解析,但肯定是Go中的
json.Unmarshal()
在程序中增加了大量时间

更新

我加了一句:


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

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


根据您在解析数据后对其所做的操作,额外的解析时间可能会为其自身支付费用。Go数据结构使用的内存比哈希表少,访问速度也快得多。因此,如果您对数据做了大量处理,处理时间上的节省可能会超过额外的解析时间。

正如术语注释所述,“解析”是指调用
JSON.parse()
或Go
JSON.unMarshal()
时发生的情况。剩下的工作只是遍历生成的数据结构。@Pointy我非常清楚这一点。Go中的
json.Unmarshal()
比JavaScript中的
json.parse()
慢得多(或者看起来是)。你说得对,我应该在某些地方使用不同的动词,在这里。:)好的,是的,我已经阅读了你的代码和那些结果,现在我想我明白你的意思了。这很奇怪;解析JSON在任何语言中都应该非常快,因为语法非常简单。可能差异涉及数据结构的构造(解析过程的“动作”)?或者可能没有人花太多时间优化Go JSON解析器:)@Pointy FWIW,我添加了一个Ruby版本。Go版本在大多数情况下只快一秒。@Mostafa请参见:
$ 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