Jak*_*édl 20 php xml performance
对于某个项目,我需要一些方法来解析XML并从中获取数据.所以我想知道,哪一个内置解析器最快?
此外,解析器可以接受XML字符串作为输入将是很好的 - 我有自己的线程安全的文件实现,我不希望一些讨厌的非线程安全库使我的努力无用.
最快的解析器将是SAX - 它不必创建一个dom,它可以使用部分xml或逐步完成.有关PHP SAX解析器(Expat)的信息可以在这里找到.或者,有一个名为SimpleXML的基于libxml的DOM解析器.基于DOM的解析器将更容易使用,但通常会慢几个数量级.
**这主要面向那些以XML Parsing开头并且不确定使用哪个解析器的人.
解析有两种"大"方法 - 您可以将XML加载到内存中并找到所需内容(DOM,SimpleXML),也可以将其流式化 - 读取并根据您读取的内容执行代码(XMLReader,SAX) ).
根据Microsoft的说法,SAX是一个"推送"解析器,它将每条信息发送到您的应用程序,您的应用程序将对其进行处理.SimpleXML是一个"拉"解析器,它允许您跳过数据块,只捕获您需要的数据.据微软称,这可以简化和加速你的应用程序,我认为.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.
Run Code Online (Sandbox Code Playgroud)
虽然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
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,尽管SimpleXML中的定位元素在加载完毕后稍微快一点,但实际使用XMLReader的速度实际上要快6倍.
您可以在PHP中如何使用XMLReader找到有关使用XMLReader的一些信息?