【问题标题】:XML Parsing vs DOM Implementation create methodsXML 解析 vs DOM 实现创建方法
【发布时间】:2011-10-12 09:35:00
【问题描述】:

我记得很清楚,使用 DOM 实现在文档上创建新的 HTML 元素被认为比将 HTML 字符串分配给适用的 HTML 元素的“innerHTML”属性要慢得多。

在使用 JavaScript 编写 XML 文档时是否同样适用?与其使用 DOM 实现的各种创建方法,不如只生成 XML 字符串并解析它会更快吗?

只是我想知道的事情...... :)

*EDIT - 添加了一个示例 *

哪个更快? (我将使用 jQuery 的 parseXML 函数来做解析示例):

var myXdoc = $.parseXML("<person><name>Bob</name><relation>Uncle</relation>");

或者

var myXdoc

if (window.ActiveXObject) {
    myXdoc = new ActiveXObject("Microsoft.XMLDOM");
    myXdoc.async = false;
}
else if (document.implementation && document.implementation.createDocument)
    myXdoc = document.implementation.createDocument("", "", null);

var p = myXdoc.documentElement.appendChild(myXdoc.createElement("person"));
var n = p.appendChild(myXdoc.createElement("name"));
n.appendChild(myXdoc.createTextNode("Bob"));
var r = p.appendChild(myXdoc.createElement("relation"));
r.appendChild(myXdoc.createTextNode("Uncle"));

【问题讨论】:

  • 您是在问使用innerHTML 解析xml 字符串是否更快?还是有我不知道的innerXml 实现?
  • 不,我将使用 innerHTML 与使用解析 XML 进行比较。正如 innerHTML 比使用例如 document.createElement("table") 更快。

标签: javascript xml parsing dom


【解决方案1】:

首先我们必须知道为什么createDocument() 可能会很慢。原因是 DOM 是活动的,如果您正在修改它,它会触发对 DOM 树的重新验证,并且可能会重新绘制站点。每次。但是我们可以通过使用createDocumentFragment() 来避免这种不必要的重新验证和重新绘制。 DocumentFragment 不是 DOM 的一部分,因此它不会触发任何事件。因此,您可以构建完整的 DOM 部分,并在最后一步将其附加到 DOM 树中。我认为这是创建大型 DOM 部件的最快方法。

更新 我使用 Firebug 在 Firefox 7 中对其进行了测试。代码:

console.time("a");
for(var i=0; i<1000; i++) {
$.parseXML("<person><name>Bob</name><relation>Uncle</relation></person>")
}
console.timeEnd("a");

console.time("b");
for(var i=0; i<1000; i++) {
var myXdoc
if (document.createDocumentFragment) {
    myXdoc = document.createDocumentFragment();
}
var p = myXdoc.appendChild(document.createElement("person"));
var n = p.appendChild(document.createElement("name"));
n.appendChild(document.createTextNode("Bob"));
var r = p.appendChild(document.createElement("relation"));
r.appendChild(document.createTextNode("Uncle"));
}
console.timeEnd("b");

结果:“a”大约 140 毫秒,“b”大约 35 毫秒。所以字符串解析版本比较慢。

更新2 很可能第二个变体在任何其他浏览器中也更快。因为 parse 方法也必须构建 DOM 对象,而且它很可能使用相同的方法(例如:document.createElement)。所以解析方法不能更快。但它比较慢,因为它首先要解析字符串。

【讨论】:

  • 我知道这是 jQuery 用来加速创建新 HTML 元素的方法。但通常的实现从预期 HTML 的字符串表示开始。我会用一个例子来更新我的问题。
  • 我查看了 jQuery 如何“解析”我上面提到的 HTML 字符串。事实证明,innerHTML 并不是专门使用的。通过一系列正则表达式和其他字符串函数,他们使用 innerHTML 属性和一些 DOM 实现来构建 HTML 节点。
  • 非常感谢,我已经在我的代码中确定了一些可以从解析切换到 DOM 实现来提高性能的地方。
猜你喜欢
  • 2010-09-16
  • 2010-10-29
  • 2010-12-25
  • 2014-05-19
  • 1970-01-01
  • 2013-04-04
  • 2012-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多