额外的空间会减慢处理器的速度吗?
Posted
技术标签:
【中文标题】额外的空间会减慢处理器的速度吗?【英文标题】:Does extra space slow down the processor? 【发布时间】:2011-04-12 22:23:51 【问题描述】:在学习how to "correctly" unset a node 之后,我注意到使用 php 的 unset() 函数会留下制表符和空格。所以现在我有时在节点之间有这么一大块空白。我想知道 PHP 是否会遍历空格/返回/制表符,以及它是否最终会减慢系统速度。
我也在问是否有一个容易去除未设置留下的空间?
谢谢, 瑞恩
补充说明:
这就是我在取消设置节点后删除空格的方式,它对我有用。
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->load($xmlPath);
$dom->save($xmlPath);
【问题讨论】:
【参考方案1】:它是否会减慢这个过程:可能很少关心。
simpleXML 就是这么简单。如果您需要“漂亮”的输出,DOM 是您的朋友:
<?php
$xml = '
<xml>
<node>foo </node>
<other>bar</other>
</xml>';
$x = new SimpleXMLElement($xml);
unset($x->other);
echo $x->asXML();
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml);
$dom->documentElement->removeChild($dom->documentElement->lastChild);
echo $dom->saveXML();
【讨论】:
将“proper”替换为“pretty”以避免对“凌乱”的 XML 文档的正确性产生任何误解。 这相当于未设置吗? $dom->documentElement->removeChild($dom->documentElement->lastChild);如果我只想格式化输出,我可以省略这一行吗?谢谢,瑞恩 是的,那行只是为了进行随机的 DOM 操作,很容易被省略。如果您想格式化 SimpleXML 的输出,只需将import
的结果放入 DOM 并调用 saveXML
以进行一些漂亮的格式化,这并不罕见。
我在尝试上述方法时收到此错误:警告:DOMDocument::loadXML() [domdocument.loadxml]: Start tag expected, 'bugs.php.net/bug.php?id=45996,但我运行的是 2.7.6,所以我不确定这是否仍然适用。
我没有说import
;)。尝试在此处使用该功能:php.net/manual/en/function.dom-import-simplexml.php 如果这不起作用,请发布/粘贴一些您正在尝试的实际代码。【参考方案2】:
XML 中的空白是 TextNodes,例如
<foo>
<bar>baz</bar>
</foo>
真的
<foo><- whitespace node
-><bar>baz</bar><- whitespace node
-></foo>
如果你删除 <bar>
节点,你会得到
<foo><- whitespace node
-><- whitespace node
-></foo>
我认为 SimpleXml 不允许您轻松访问 Text 节点(可能通过 XPath),但 DOM 可以。有关详细信息,请参阅Wrikken's answer。既然知道了空格是一个节点,那么你也可以想象将它解析成一个节点会占用一些 cpu 周期。但是,我想说速度影响可以忽略不计。如有疑问,请使用一些真实数据进行基准测试。
编辑:证明空白确实是节点
$xml = <<< XML
<foo>
<bar>baz</bar>
</foo>
XML;
$dom = new DOMDocument;
$dom->loadXML($xml);
foreach($dom->documentElement->childNodes as $node)
var_dump($node);
给了
object(DOMText)#4 (0)
object(DOMElement)#6 (0)
object(DOMText)#4 (0)
【讨论】:
你不是在暗示空格是一个标签?! ;-) 另外,Libxml 可以区分空白节点和文本,实际上 XMLReader 有两种类型的空白。 XPath 当然是//text()[normalize-space()='']
,但如果preserveWhiteSpace 为假,这些将在加载时被删除。
@Robin:我认为 Gordon 的意思是它们是实际的节点。
@Robin <whitespace>
不是暗示标签,只是标签之间有一个节点。抱歉,如果这具有误导性。将其更改为希望不那么模棱两可的标记。【参考方案3】:
实际上是 Libxml 进行 XML 解析,解析器读取的空格与输入流(或文件)中的每个其他字符相同。大多数 PHP xml API 在底层使用 Libxml(XmlReader、XmlWriter、SimpleXml Xslt、Dom...)——其中一些允许您访问空白(例如 Dom、XmlReader),而另一些则不允许(例如 SimpleXML)
【讨论】:
【参考方案4】:对所提问题的快速回答:
我想知道 PHP 是否会迭代 空格/返回/制表符以及是否 它最终会减慢 系统。
不,PHP(或 libxml)并没有真正迭代它。 理论上有更多的空白会减慢系统的速度,尽管它是如此之小以至于无法直接测量。您可以通过从 XML 中删除 all 空格来自行测试。它不会让它更快。
我也在问有没有 容易去除空间未设置的叶子 落后?
恐怕没有简单的方式。您可以将您的 SimpleXML 内容导入 DOM 并使用 formatOutput
完全重塑空白,如另一个答案中所建议的那样,或者您可以使用第三方库来为您完成此操作,但您不会找到一个简单的内置- 这样做的方式。
【讨论】:
以上是关于额外的空间会减慢处理器的速度吗?的主要内容,如果未能解决你的问题,请参考以下文章