【问题标题】:What is the fastest XML parser in PHP?PHP 中最快的 XML 解析器是什么?
【发布时间】:2011-03-04 04:16:21
【问题描述】:

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

此外,如果解析器可以接受 XML 字符串作为输入,那就太好了 - 我有自己的线程安全处理文件的实现,我不希望一些讨厌的非线程安全库来做我的努力没用。

【问题讨论】:

  • 线程安全真的是一个问题吗? 99% 的 PHP 应用程序是单线程的。
  • 我很确定他说的是比赛条件based on another question of his
  • 恐怕是。我想我会使用 SimpleXML。不过,不知道它的性能。

标签: php xml performance


【解决方案1】:

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

【讨论】:

  • 同意。流模式下无与伦比的性能,非常低的内存消耗。对于类似提要或重复的 XML 是最佳选择。查看php.net/manual/en/function.xml-parse.php 的示例。在 10MB XML 上进行测试,在 I7 笔记本上解析时间约 3 秒,包括存储到具有全文索引的 MySQL 平面表,峰值堆使用约 600kB (!)
  • 如果……我们的许多企业客户只是从 CSV 切换到 XML,并认为 JSON 是来自帐户的一些人。
【解决方案2】:

**这主要面向那些从 XML 解析开始但不确定使用哪个解析器的人。

有两种“大”方法可以进行解析 - 您可以将 XML 加载到内存中并找到您需要的内容(DOM、SimpleXML),或者您可以流式传输它 - 读取它并根据您读取的内容执行代码( XMLReader, SAX)。

According to Microsoft,SAX 是一个“推送”解析器,它将每条信息发送到您的应用程序并由您的应用程序处理。 SimpleXML 是一个“拉式”解析器,它允许您跳过数据块并只获取您需要的数据。根据 Microsoft 的说法,这可以简化和加速您的应用程序,我认为 .NET 和 PHP 实现是相似的。我想你的选择取决于你的需要——如果你只是从一个较大的块中提取几个标签并且可以使用$xml->next('Element') 来跳过重要的块,你可能会发现 XMLReader 比 SAX 更快。

重复解析“小”(

每个 Parse Time 是获取 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 的一些信息

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 对于加载许多小型 xml 文件,您会推荐哪种方式最快?
    • @JohnMagnolia,我会尝试 Evan Carroll 的回答中提到的 SimpleXML 和 SAX 解析器。速度是一个考虑因素,以及编程接口的易用性。后者是个人喜好问题,所以你应该尝试两者,看看你喜欢什么。
    • 在回答 John Magnolia 的问题时,对于许多小文件,XMLReader 比 SimpleXML 更快(请参阅下面的答案);大概 SAX 也是如此。
    【解决方案4】:

    PHP 中的解析器并不多。

    最有效的是 PHP 提供的那些,用 DOM 和 SimpleXML 编写基准测试并检查哪个性能更好。

    【讨论】:

    • 不要只是基准测试、基准测试和发布您的测试数据、测试方法和结果!
    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多