额外的空间会减慢处理器的速度吗?

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>

如果你删除 &lt;bar&gt; 节点,你会得到

<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 &lt;whitespace&gt; 不是暗示标签,只是标签之间有一个节点。抱歉,如果这具有误导性。将其更改为希望不那么模棱两可的标记。【参考方案3】:

实际上是 Libxml 进行 XML 解析,解析器读取的空格与输入流(或文件)中的每个其他字符相同。大多数 PHP xml API 在底层使用 Libxml(XmlReader、XmlWriter、SimpleXml Xslt、Dom...)——其中一些允许您访问空白(例如 Dom、XmlReader),而另一些则不允许(例如 SimpleXML)

【讨论】:

【参考方案4】:

对所提问题的快速回答:

我想知道 PHP 是否会迭代 空格/返回/制表符以及是否 它最终会减慢 系统。

不,PHP(或 libxml)并没有真正迭代它。 理论上有更多的空白会减慢系统的速度,尽管它是如此之小以至于无法直接测量。您可以通过从 XML 中删除 all 空格来自行测试。它不会让它更快。

我也在问有没有 容易去除空间未设置的叶子 落后?

恐怕没有简单的方式。您可以将您的 SimpleXML 内容导入 DOM 并使用 formatOutput 完全重塑空白,如另一个答案中所建议的那样,或者您可以使用第三方库来为您完成此操作,但您不会找到一个简单的内置- 这样做的方式。

【讨论】:

以上是关于额外的空间会减慢处理器的速度吗?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中加索引会不会加快更新的速度?有人说会减慢更新速度?谁知道为啥吗?

3dsmax开启慢为啥?

非聚集索引会减慢插入速度吗?

过度注释代码会减慢执行速度吗? [复制]

条件语句会减慢着色器的速度吗?

犰狳库是不是会减慢矩阵运算的执行速度?