【问题标题】:speed of decoding and encoding json in perlperl中解码和编码json的速度
【发布时间】:2014-04-05 01:02:17
【问题描述】:

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

我使用 from_json 解码 JSON 字符串,并使用 to_json 进行编码。

更具体一点:

数据规模可能类似于散列中的 100,000 个项目

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

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


我的问题是:

解码和编码过程的速度差别很大。

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

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

【问题讨论】:

  • 您是否安装了 JSON::XS?

标签: json performance perl decode encode


【解决方案1】:

解析比格式化在计算上要昂贵得多。

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

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

【讨论】:

  • 能解释一下 ** 对我来说,arsing 在计算上比格式化 ** 更昂贵吗?因为我认为格式化只是解析的逆过程。
  • 除法是乘法的逆运算,但一个比另一个计算成本更高。
  • 关于“解析比格式化在计算上的成本更高”,这不是真的。编码基本上是一个以变量类型为键的 switch 语句。解码基本上是在流中的下一个标记上键入的 switch 语句。这两个过程几乎相同,尤其是对于 JSON。
  • Re "解析比格式化在计算上要昂贵得多",一般来说,是的,但不是这里。用于解析 JSON 的 switch 非常小。远小于编码器需要处理的 Perl 值的种类数。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 2016-05-31
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多