【问题标题】:JSON vs XML parsing speed in DelphiDelphi 中的 JSON 与 XML 解析速度
【发布时间】:2011-03-14 20:34:55
【问题描述】:

我们正在创建一个使用大量 XML 解析的应用程序,我想也许可以使用 JSON,因为我们可以使用 JSON 作为 XML 的替代方案。

我需要测试 JSON 或 XML 哪个更快,但想先在这里征求意见。

JavaScript 中的 JSON 是原生的,而且速度很快。当然比解析 XML 更快。但在 Delphi 中,没有用于执行此操作的本地类。

所以我的问题是 - 在 Delphi 中哪个更快,使用 XML 或 JSON 解析器库?还是他们的速度相等?

如果它更快,那么您更喜欢哪个 - Delphi Web UtilsJSON Delphi LibraryJSON Toolkit

【问题讨论】:

    标签: xml json delphi parsing delphi-xe


    【解决方案1】:

    使用编写良好的解析器,XML 和 JSON 将具有或多或少相同的时间。您可以使用慢速 JSON 解析器和快速 XML 解析器。

    XML 可能会慢一些,因为语法比 JSON 复杂。

    但瓶颈主要是从硬盘读取,而不是解析内容。

    我们使用 JSON 作为 ORM 的客户端/服务器,有几个原因(但你会发现其他的,我不想在这里拖钓,只是从我们的小实验中说出来):

    • 与 XML 一样,它是一种基于文本的、人类可读的格式,用于表示简单的数据结构和关联数组(称为对象);
    • 与 XML 相比,它更易于阅读(对人类和机器而言)、实施更快且通常更小;
    • 这是一种非常有效的数据缓存格式;
    • 它的布局允许在适当的位置重写为单独的以零结尾的 UTF-8 字符串,几乎不会浪费空间:此功能用于将表格结果快速 JSON 转换为文本,无需内存分配或数据复制;
    • 它由 JavaScript 语言原生支持,使其成为任何 AJAX(即 Web 2.0)应用程序中的完美序列化格式;
    • JSON 格式在众所周知的简单 RFC 中指定;
    • JSON 和我们的 ORM 的默认文本编码是 UTF-8,它允许存储和通信完整的 Unicode 字符集;
    • 它是自 .NET 框架 3.5 以来在 Windows Communication Foundation (WCF) 中创建的 ASP.NET AJAX 服务使用的默认数据格式;所以微软官方已经“准备好”了;
    • 对于二进制 blob 传输,没有 XML 中的 CDATA。因此,我们只需将二进制数据编码为 JSON 字符串中的十六进制或 Base64(使用较少空间)。

    关于解析速度,可以看看我们的in-place parser and JSON writer from SQLite3 results。它针对速度进行了非常优化,而且速度很快。我们为任何 TPersistent(包括集合)编写了一个简单但 efficient JSON serialization 的代码。我们只需添加a dynamic array JSON serializer,也很快。

    补充说明:

    所有这些解析器都与您提到的不同,因为它们解析 JSON 内容并将其格式化为输入缓冲区中的文本:在解析过程中没有进行内存分配,因此它应该比其他解决方案更快。文本内容未转义,字段以#0 结尾,并计算出指向文本开头的指针。所以要访问一个值,你只需使用指针来获取数据。它通常会立即解析一些 MB 的 JSON 内容。

    还可以查看JSON parser embedded in DWS。作者声称它很快。但仍然为每个对象分配了一个内存块。

    【讨论】:

    • 关于我们的就地 JSON 解析,以及 DOM/SAX XML 解析器技术,你可以看看blog.synopse.info/post/2011/06/02/Fast-JSON-parsing
    • @Bouchez:您的 JSON 解析器是否可供其他人使用?如果可以,能否提供下载链接?谢谢
    • 解析器在我们的SynCommons.pas unit 中可用,作为一组低级函数。没有高级类能够直接将任何类型的 JSON 内容转换为树,因为我们试图避免在 mORMot 中这样的内存和 CPU 消耗过程,并且我们依赖于简单的对象或数组。但是你有强大的 JSONToObject() 和 ObjectToJSON() 函数。
    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    相关资源
    最近更新 更多