PHP:JSON 或 XML 解析器更快吗?

Posted

技术标签:

【中文标题】PHP:JSON 或 XML 解析器更快吗?【英文标题】:PHP: is JSON or XML parser faster? 【发布时间】:2010-11-02 20:35:46 【问题描述】:

我正在构建与 Twitter API 接口的类,我想知道 php 的内置 XML 或 JSON 解析器是否更快? Twitter 将以任何一种格式向我发送相同的数据,因此 PHP 性能将决定我的选择。我正在使用 php_apc,因此您可以忽略解析时间并假设我正在使用字节码。

谢谢!

更多:我只是想从数据中获取关联数组。我不是在做树行走、节点迭代或任何太复杂的事情。格式将始终相同。 (我希望!)

【问题讨论】:

为什么不在您将要使用的真实数据集上自己进行基准测试呢?解析器的性能可能很大程度上取决于您提供的内容。 您打算使用哪一种 PHP xml-apis?我猜 SimpleXML 和 DOM 更慢或与 JSON 相当,而 XMLReader 或 SAX 更快。 【参考方案1】:

我没有做任何基准测试,但是...

由于 JSON 只是对嵌套字符串序列的描述,不需要提供 DOM 接口、属性解析和其他微妙的东西,我猜 JSON 解析器比 XML 解析器快得多。

【讨论】:

我同意。 JSON 具有更简单且动态性更低的结构。 解析 JSON 格式比定义良好的 XML 复杂得多。解析字符串是一项非常复杂的工作,可能因为你使用标准库函数你感觉不到,但是解析结构化的 XML 比 JSON 结构化的数据要简单得多。 如果只考虑纯解析,JSON 应该更快。但这也取决于解析数据的用途。 呃。这些不是正确的答案——正确的答案是“去测量它”。严重地。我已经测量了性能,并且有很大的重叠——慢 json 解析器比快速 xml 解析器慢,反之亦然。注意:XML PARSING 是一个可以快速完成的非常低级的事情(XML 也是如此)。 DOM与解析无关;它是一种树形结构,可以选择用低级标记构建。完全可选的 XML Schema 也是如此。使用此类附加组件具有显着的性能影响(开销)。如果需要对实际对象进行真正的数据绑定,那么 JSON 附加组件也是如此。 @mike - 愿意分享一个实际结果的链接吗?【参考方案2】:

答案取决于您打算如何使用它。我的意思是,如果您将创建一些请求并在 PHP 脚本中处理它们,我相信 XML 会快得多。但是,一旦您考虑创建和 AJAX 调用以及随后的结果处理,您应该考虑使用 JSON,因为您受益于 javascript 自动将 JSON 结果表示为对象,它支持带有回调函数的跨域请求,而对于 XML,您将代理.

【讨论】:

【参考方案3】:

JSON 的大小往往要小很多

你也运行 json_decode 一次,然后以数组的形式访问数据,对任何其他函数没有用处。

如果不运行基准测试,使用 JSON 会更快

【讨论】:

【参考方案4】:

上面 Adam 的评论说服了我对它进行基准测试。使用https://twitter.com/status/mentions.[format],我发现simplexml_load_string() 比json_decode() 稍快。但差异实际上是一个误差范围。

Test #1 time (xml): 3.75221395493 seconds
Test #2 time (xml): 4.1562371254 seconds
Test #3 time (xml): 3.60420489311 seconds
Test #4 time (xml): 3.85622000694 seconds
Test #5 time (xml): 3.89622211456 seconds

Test #1 time (json): 4.53225803375 seconds
Test #2 time (json): 4.06823205948 seconds
Test #3 time (json): 4.03222990036 seconds
Test #4 time (json): 3.80421590805 seconds
Test #5 time (json): 3.88022208214 seconds

在以下代码中(我已经将数据卷曲到文件 data.[xml,json])。

<?php

$test = 'json';  //xml or json
$data = implode(file("data.".$test),"\r\n");

for ($t=1; $t<=5; $t++) 
    $start[$t] = microtime(1);
    for ($i=0; $i<3000; $i++) 
        if ($test == 'xml') $xml = simplexml_load_string($data);
        else $json = json_decode($data);
    
    $end[$t] = microtime(1);
    echo "<p>Test #$t time ($test): " . ($end[$t] - $start[$t]). " seconds</p>";

【讨论】:

然而,该测试在加载后不会从 XML 对象中读取数据。虽然 json_decode 返回一个简单的数组,但 SimpleXML 为对象提供了读取数据的特殊方法,包括一些动态魔法。这可能会影响性能。【参考方案5】:

当 json 返回的是一个对象时,我倾向于发现 simplexml_load_string() 比 json_decode() 快。

但是,使用 json_decode($string, true) 将 json 作为数组返回实际上比使用对象快得多(在将数组与对象进行比较时,大多数情况下 PHP 都是如此)。

在这些情况下,我看到 json_decode() 的速度是 simplexml_load_string() 的两倍多。

【讨论】:

【参考方案6】:

您是否考虑过总体带宽节省可能会如何影响脚本的性能?如果您的请求要重复很长时间,那么使用 JSON 应该是合理的经济选择。

【讨论】:

以上是关于PHP:JSON 或 XML 解析器更快吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中是不是有比 Xalan/Xerces 更快的 XML 解析器 [关闭]

哪个是更快的 XML 解析器? [关闭]

在 iOS 中解析 JSON 与解析 XML

学习JSON

更具体的选择器更快解析吗?

在 Web 服务中解析数据 Json 或 XML 哪个更快?