perl中解码和编码json的速度

时间:2014-04-05 01:02:17

标签: json performance perl decode encode

我正在处理一个小的perl脚本。我使用JSON存储数据。

我使用from_jsonto_json编码解码JSON字符串。

更具体一点:

数据比例可能类似于散列

中的 100,000 项目

数据存储在磁盘中的文件中。

所以要解码它,我必须先从磁盘上读取它


我的问题是:

解码和编码过程之间的速度差异很大。

编码过程似乎比解码过程快得多。

我想知道是什么造成了这种差异?

2 个答案:

答案 0 :(得分:5)

解析比格式化计算成本高得多。

from_json必须解析json结构并将它们转换为perl数据结构,to_json只需遍历数据结构并以格式化方式“打印”出每个项目。

解析是一个复杂的主题,仍然是CS理论工作的重点。但是在基础级别,解析是一个两步操作。您需要解析令牌的输入流,然后将令牌序列验证为该语言中的有效语句。另一方面,编码是单步操作,您已经知道它是有效的,您只需将其转换为表示。

答案 1 :(得分:3)

JSON(模块)不是解析器/编码器。它只是JSON :: XS(非常快)或JSON :: PP(不是那么多)的前端。如果安装JSON将使用JSON :: XS,但如果不安装则默认为JSON :: PP。根据您是否安装了JSON :: XS,您可能会看到非常不同的数字。

我可以看到Perl解析器(如JSON :: PP)具有不同的编码和解码性能,因为由于所有开销而难以编写最佳的东西,但使用JSON的差异应该小得多: :XS

使用JSON :: XS解码可能仍然有点慢,因为它必须分配所有内存块。分配内存是一个相对昂贵的过程,在解码时需要花费更多的时间来完成编码。例如,Perl字符串由三个内存块(标量头,标量体和字符串缓冲区本身)组成。编码时,只有在需要放大输出缓冲区时才能分配内存。