PHP中最快的XML解析器是什么?

时间:2010-06-15 19:59:30

标签: php xml performance

对于某个项目,我需要一些方法来解析XML并从中获取数据。所以我想知道,哪一个内置解析器是最快的?

此外,解析器可以接受XML字符串作为输入会很好 - 我有自己的线程安全的文件实现,我不想让一些讨厌的非线程安全的库来做我的努力无用的。

4 个答案:

答案 0 :(得分:9)

最快的解析器将是SAX - 它不必创建一个dom,它可以使用部分xml或逐步完成。有关PHP SAX parser (Expat) can be found here的信息。或者,有一个libxml based DOM parser named SimpleXML。基于DOM的解析器将更容易使用,但通常会慢几个数量级。

答案 1 :(得分:8)

**这主要面向那些以XML Parsing开头并且不确定使用哪个解析器的人。

有两个"大"解析的方法 - 你可以将XML加载到内存中并找到你需要的东西(DOM,SimpleXML),也可以流式传输它 - 读取它并根据你读的内容执行代码(XMLReader,SAX)。

According to Microsoft,SAX是"推送"解析器,它将每条信息发送到您的应用程序,然后您的应用程序处理它。 SimpleXML是一个" pull"解析器,它允许您跳过数据块,只捕获您需要的内容。据微软称,这可以简化和加速你的应用程序,我认为.NET和PHP的实现是相似的。我想你的选择取决于你的需求 - 如果你从一个较大的块中拔出一些标签并且可以使用$xml->next('Element')跳过重要的块,你可能会发现XMLReader比SAX更快。

解析"小" (< 30kb,700行)重复的XML文件,您可能不会期望解析方法之间存在巨大的时间差异。我很惊讶地发现有。我运行了在SimpleXML和XMLReader中处理的小型Feed的比较。希望这将有助于其他人想象这些数据有多大差异。对于现实生活比较,这是解析对两个亚马逊MWS产品信息请求源的响应。

每个解析时间是获取2个XML字符串并返回包含每个字符串值的120个变量所需的时间。每个循环使用不同的数据,但每个测试都以相同的顺序在相同的数据上。

SimpleXML将文档加载到内存中。我使用microtime来检查完成解析的时间(提取相关值),以及创建元素所花费的时间(调用new SimpleXMLElement($xml)时)。我将这些舍入到小数点后4位。

Parse Time: 0.5866 seconds
Parse Time: 0.3045 seconds 
Parse Time: 0.1037 seconds
Parse Time: 0.0151 seconds 
Parse Time: 0.0282 seconds 
Parse Time: 0.0622 seconds 
Parse Time: 0.7756 seconds
Parse Time: 0.2439 seconds  
Parse Time: 0.0806 seconds 
Parse Time: 0.0696 seconds
Parse Time: 0.0218 seconds
Parse Time: 0.0542 seconds
__________________________
            2.3500 seconds
            0.1958 seconds average

Time Spent Making the Elements: 0.5232 seconds 
Time Spent Making the Elements: 0.2974 seconds 
Time Spent Making the Elements: 0.0980 seconds 
Time Spent Making the Elements: 0.0097 seconds 
Time Spent Making the Elements: 0.0231 seconds 
Time Spent Making the Elements: 0.0091 seconds 
Time Spent Making the Elements: 0.7190 seconds 
Time Spent Making the Elements: 0.2410 seconds 
Time Spent Making the Elements: 0.0765 seconds 
Time Spent Making the Elements: 0.0637 seconds 
Time Spent Making the Elements: 0.0081 seconds 
Time Spent Making the Elements: 0.0507 seconds 
______________________________________________
                                2.1195 seconds
                                0.1766 seconds average
over 90% of the total time is spent loading elements into the DOM.

Only 0.2305 seconds is spent locating the elements and returning them.

虽然XMLReader是基于流的,但我能够跳过其中一个XML提要的重要部分,因为我想要的数据接近每个元素的顶部。 "你的里程可能会变化。"

Parse Time: 0.1059 seconds  
Parse Time: 0.0169 seconds 
Parse Time: 0.0214 seconds 
Parse Time: 0.0665 seconds 
Parse Time: 0.0255 seconds 
Parse Time: 0.0241 seconds 
Parse Time: 0.0234 seconds 
Parse Time: 0.0225 seconds 
Parse Time: 0.0183 seconds 
Parse Time: 0.0202 seconds 
Parse Time: 0.0245 seconds 
Parse Time: 0.0205 seconds 
__________________________
            0.3897 seconds
            0.0325 seconds average

令人惊讶的是,尽管SimpleXML中的定位元素在加载完毕后稍微快一点,但实际上整体使用XMLReader 的速度要快6倍。

您可以在How to use XMLReader in PHP?

找到有关使用XMLReader的一些信息

答案 2 :(得分:3)

每个XML扩展都有自己的优点和缺点。例如,我有一个脚本从Stack Overflow解析XML数据转储。 posts.xml 文件是2.8GB!对于这个大型XML文件,我不得不使用XMLReader,因为它以流模式读取XML,而不是像DOM扩展那样尝试一次加载和表示整个XML文档。

因此,您需要更具体地描述如何使用XML,以便决定使用哪个PHP扩展。

所有PHP的XML扩展都提供了一些将XML数据作为字符串读取的方法。

答案 3 :(得分:-3)

PHP中没有太多的解析器。

最有效的将是PHP提供的,用DOM和SimpleXML编写基准并检查哪些表现更好。