【问题标题】:Is parsing JSON faster than parsing XML解析 JSON 是否比解析 XML 更快
【发布时间】:2011-01-04 17:20:13
【问题描述】:

我正在创建一个复杂的 JavaScript 库,用于与我公司的服务器端框架一起工作。

服务器端框架将其数据编码为简单的 XML 格式。没有花哨的命名空间或类似的东西。

理想情况下,我想将浏览器中的所有数据解析为 JSON。但是,如果我这样做,我需要重写一些服务器端代码以输出 JSON。这很痛苦,因为我们有无法轻易更改的公共 API。

我真正关心的是浏览器在解析 JSON 与 XML 时的性能。真的有很大的不同需要担心吗?还是我应该专门使用 JSON?有没有人对两者之间的性能差异有任何经验或基准?

我意识到大多数现代 Web 开发人员可能会选择 JSON,我明白为什么。但是,我真的只对性能感兴趣。如果证明存在巨大差异,那么我准备花费额外的精力为客户端生成 JSON 服务器端。

【问题讨论】:

    标签: javascript xml json


    【解决方案1】:

    JSON 应该更快,因为它是 JS Object Notation,这意味着它可以被 JavaScript 原生识别。在 GET 方面的 PHP 中,我经常会做这样的事情:

    <script type="text/javascript">
        var data = <?php json_encode($data)?>;
    </script>
    

    有关这方面的更多信息,请参阅此处:

    Why is Everyone Choosing JSON Over XML for jQuery?

    另外...你真的需要付出什么“额外的努力”来“生成”JSON?您肯定不能说您将手动构建 JSON 字符串吗?几乎每一种现代服务器端语言都有将本机变量转换为 JSON 字符串的库。例如,PHP 的核心 json_encode 函数将关联数组转换成这样:

    $data = array('test'=>'val', 'foo'=>'bar');
    

    进入

    {"test": "val", "foo": "bar"}
    

    这只是一个 JavaScript 对象(因为在 JS 中没有关联数组(严格来说))。

    【讨论】:

    • 另外,(如链接问题中所指出的),JSON 通常在字节方面更轻量级,因此传输效率更高。与解析 JSON 与 XML 的任何区别相比,您很可能会从减少带宽需求中获得更多的性能优势。
    • 我相信编译PHP的时候需要开启json_encode/decode。
    • @Alexander:我以前从来没有这样做过。它总是有效的。
    • 修正,通过在编译时添加--disable-json,可以禁用JSON。
    • 这个答案在某些方面可能是错误的。 JS 确实有关联数组,实际上 {} 和 [] 都是关联数组 TMK。其次,JSON 是一种类似于 JS 对象的符号这一事实并不意味着 JSON 解析的 JS 实现比 JSON 解析的 Java 实现等更快。
    【解决方案2】:

    首先,我要感谢所有回答我问题的人。我非常感谢您的所有回复。

    关于这个问题,我通过运行一些基准进行了一些进一步的研究。解析发生在浏览器中。 IE 8 是唯一没有原生 JSON 解析器的浏览器。 XML 是与 JSON 版本相同的数据。

    Chrome(版本 8.0.552.224),JSON:92 毫秒,XML:90 毫秒

    Firefox(版本 3.6.13),JSON:65 毫秒,XML:129 毫秒

    IE(版本 8.0.6001.18702),JSON:172 毫秒,XML:125 毫秒

    有趣的是,Chrome 的速度似乎几乎相同。请注意,这是解析大量数据。使用少量的 sn-ps 数据,这可能没什么大不了的。

    【讨论】:

    • 我很想看到 Firefox 9+ 和 Chrome 16+ 的更新
    • 奇怪的结果,根据我自己的经验,json 在浏览器中总是快得多。也许您有一些特定的数据,其中 xml 开销与数据本身相比并不多。但是,如果它对你有效,那么它一定是真的。你永远不能假设什么,你应该总是测试。
    • 我不认为这些基准是准确的。正如@justkt 在他的回答中分享的那样; this link 比较好。
    • 事实上我认为这些基准测试很好。我点击了@scaryguy 分享的链接,然后我测试了自己(navioo.com/ajax/examples/json/test.php)。在 Chrome 和 IE 中,JSON 和 XML 之间的差异很小。
    【解决方案3】:

    基准测试已经完成。 Here's one。一些早期浏览器的差异似乎是一个完整的数量级(大约 10 毫秒而不是 100 毫秒),但并不大。部分原因在于服务器响应时间——XML 作为一种数据格式更为庞大。部分原因在于解析时间 - JSON 允许您发送 JavaScript 对象,而 XML 需要解析文档。

    您可以考虑向您的公共 API 添加一个返回 JSON 的方法,而不是修改现有函数(如果它变成并发出),除非您不想公开 JSON。

    另请参阅 SO 问题 When to prefer JSON over XML?

    【讨论】:

    • 次要的 nitpick,wrt “JSON 允许您发送 JavaScript 对象,而 XML 需要解析文档”——这并不完全正确;两者都需要写入和读取(序列化/反序列化,编组/解组),因为所有数据都作为字节流发送。然而,与 XML DOM 树相比,为 JSON 构建的数据结构确实更自然。
    • @StaxMan - 感谢您的更正。我要暗示的技术答案是客户端的 JSON 可以eval-ed 到一个对象(通常需要注意 eval 应用),而必须解析 XML 的 DOM 树。
    • @justkt 嗯好的,是的,那就和数据本身的绑定有关
    • @quertymk,他们还支持 JavaScript,因此也支持 JSON 解析器。
    • 所有主流浏览器现在都支持native JSON,它比eval更安全,而且通常更快
    【解决方案4】:

    性能并不是一个真正的考虑因素,假设您不是在谈论千兆字节的 XML。是的,这需要更长的时间(XML 更冗长),但不会引起用户注意。

    在我看来,真正的问题是 JavaScript 对 XML 的支持。 E4X 很好,但微软不支持。因此,您需要使用第三方库(例如 JQuery)来解析 XML。

    【讨论】:

    • 不是我,但我要指出的一件事是 XML 解析已经可以通过 AJAX 请求完成;生成的 xml 可以作为 DOM 树直接访问。或者您可能正在考虑从 DOM(由解析的 xml 构建的树)到“真实”Javascript 对象的数据绑定?
    【解决方案5】:

    如果可能,仅测量它是有意义的。我所说的“如果可能”是指用于 javascript(尤其是用于性能分析)的工具可能不如独立编程语言那么好。

    为什么要测量?因为仅仅基于数据格式属性的推测对于性能分析不是很有用——开发人员的直觉在预测性能方面是出了名的差。在这种情况下,它只是意味着这一切都归结为各自使用的 XML 和 JSON 解析器(和生成器)的成熟度。 XML 的好处是存在时间更长。 JSON 处理起来更简单一些。这基于实际编写了用于处理两者的库。最后,如果一切都是平等的(库的成熟度和性能优化),JSON 确实可以更快地处理。但两者都可以非常快;或者非常慢,实施不好。

    但是:我怀疑您不应该像许多人已经建议的那样太担心性能。 xml 和 json 都可以有效地解析,并且对于现代浏览器来说,可能是。 如果您遇到性能问题,则可能不是数据的读取或写入,而是其他问题;第一步实际上是弄清楚实际问题是什么。

    【讨论】:

      【解决方案6】:

      由于 JSON 是原生于 Javascript 并且专为 Javascript 设计的,因此它的性能将一整天都胜过 XML 解析。你没有提到你的服务器端语言,在 PHP 中有内置到 PHP 核心中的 json_encode/json_decode 功能......

      【讨论】:

        【解决方案7】:

        性能上的差异非常小,您甚至都不会注意到它(并且:在您遇到性能问题之前,您不应该考虑性能问题 - 还有很多更重要的需要注意的点 - 可维护、可读和文档化的代码...)。

        但是,回答你的问题:JSON 解析起来会更快(因为它是简单的 javascript 对象表示法)。

        【讨论】:

        • 这种差异仅在于少量数据。如果您解析的行数超过几十行(左右),那么解析数据肯定会花费大量时间。
        【解决方案8】:

        在这种情况下,我会说坚持使用 XML。所有主流浏览器都有一个解析格式良好的 XML 的 DOM 解析接口。此链接显示了在 Webkit/Opera/Firefox 中使用 DOMParser 接口的方法,以及在 IE 中使用 ActiveX DOM 对象:https://sites.google.com/a/van-steenbeek.net/archive/explorer_domparser_parsefromstring

        【讨论】:

        • 所有浏览器(具有适当的 JavaScript 支持)都能够像解析 XML 一样解析格式良好的 JSON 代码。
        • @Alexander:当然。我并不是在暗示他们没有,只是他说由于 API 接口等原因,在服务器端切换到 JSON 是一项不平凡的任务,所以我建议改用 XML。
        • @Alex Vidal,虽然我通常会同意,但如果他/她打算编写基于 XML 的代码,现在转换为 JSON 可能会更好,这样就不需要更多代码重写。
        • @Alex:我认为 JSON 编码不应该被视为不重要的。事实上,大多数语言(或库,如果没有本机支持)都可以将本机数据类型转换为 JSON 非常简单。
        • @treeface:我同意在大多数情况下实际转换并非易事,我专门指的是他/她的场景“但是,如果我这样做,我需要重写一些服务器端代码也吐出 JSON。这很痛苦,因为我们有我无法轻易更改的公共 API。如果输出已经是 XML,并且格式正确,并且将其转换为也输出 JSON 很痛苦,那么 XML 是最佳选择。
        【解决方案9】:

        这还取决于 JSON 的结构。树状结构往往比对象列表更有效地解析。这是一个人对数据结构的基本理解将派上用场的地方。如果您在 JSON 中解析类似列表的结构,我不会感到惊讶:

        {
                {
                    "name": "New York",
                    "country":"USA",
                    "lon": -73.948753,
                    "lat": 40.712784
                },
                {
                    "name": "Chicago",
                    "country":"USA",
                    "lon": -23.948753,
                    "lat": 20.712784
                },
                {
                    "name": "London",
                    "country":"UK",
                    "lon": -13.948753,
                    "lat": 10.712784
                }
        }
        

        然后将其与 XML 中的树状结构进行比较,可能如下所示:

        <cities>
          <country name="USA">
             <city name="New York">
                <long>-73.948753</long>
                <lat>40.712784</lat>
             </city>
             <city name="Chicago">
                <long>-23.948753</long>
                <lat>20.712784</lat>
             </city>
          </country>
         <country name="UK">
             <city name="London">
                <long>-13.948753</long>
                <lat>10.712784</lat>
             </city>
          </country>
        </cities>
        

        XML 结构可能产生比 JSON 更快的时间,因为如果我循环通过英国的节点找到伦敦,我不必循环通过其他国家来找到我的城市。在 JSON 示例中,如果伦敦靠近列表底部,我可能会这样做。但是,我们在这里所拥有的是结构上的差异。我会惊讶地发现 XML 在任何一种情况下或在结构完全相同的情况下都更快。

        Here 是我使用 Python 做的一个实验——我知道问题是从 JavaScript 的角度来看这个问题,但你可能会发现它很有用。结果表明 JSON 比 XML 更快。但是,重点是:您的结构将影响您检索它的效率。

        【讨论】:

        • @geme_hendrix 我认为结构良好的 JSON 在大多数情况下会更快。不过问题很好。
        • 那是合法的 JSON 吗?外面的大括号写着JSON object,但内容看起来像JSON array
        【解决方案10】:

        坚持使用 XML 的另一个原因是,如果您切换到 JSON,则会修改“维护合同”。 XML 比 JSON 更具类型化,因为它更自然地适用于类型化语言(即不是 javascript)。

        如果您更改为 JSON,代码库的某些未来维护者可能会在某个时候引入一个 JSON 数组,其中包含混合类型的内容(例如[ "Hello", 42, false ]),这将对任何用类型语言编写的代码提出问题。

        是的,您也可以在 XML 中做到这一点,但需要额外的努力,而在 JSON 中则可以顺利进入。

        虽然乍一看似乎没什么大不了的,但实际上它强制类型化语言中的代码坚持使用 JSON 树而不是反序列化为本机类型。

        【讨论】:

          【解决方案11】:

          我找到的关于这两个的最好例子是:

          http://www.utilities-online.info/xmltojson/#.VVGOlfCYK7M

          这意味着 JSON 比 XML 更易于人类阅读和理解。

          【讨论】:

            猜你喜欢
            • 2012-12-29
            • 1970-01-01
            • 2010-10-31
            • 2017-05-20
            • 1970-01-01
            • 2011-12-10
            • 1970-01-01
            • 1970-01-01
            • 2011-07-19
            相关资源
            最近更新 更多