我正在处理一个小的perl脚本。我使用JSON存储数据。
我使用from_json
和to_json
编码解码JSON字符串。
更具体一点:
数据比例可能类似于散列
中的 100,000 项目数据存储在磁盘中的文件中。
所以要解码它,我必须先从磁盘上读取它
我的问题是:
解码和编码过程之间的速度差异很大。
编码过程似乎比解码过程快得多。
我想知道是什么造成了这种差异?
答案 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字符串由三个内存块(标量头,标量体和字符串缓冲区本身)组成。编码时,只有在需要放大输出缓冲区时才能分配内存。