Синтаксический анализ XML и реализация DOM создают методы - PullRequest
0 голосов
/ 12 октября 2011

Я хорошо помню, что использование реализации DOM для создания новых элементов HTML в документе считалось намного более медленным, чем назначение строки HTML свойству 'innerHTML' соответствующего элемента HTML.

то же самое относится к созданию документов XML с использованием JavaScript?Вместо того, чтобы использовать различные методы создания реализации DOM, будет ли быстрее просто сгенерировать строку XML и проанализировать ее?

Просто то, о чем я задумался ....:)

* EDIT -Добавлен пример *

Что быстрее?(Я буду использовать функцию parseXML jQuery для выполнения примера разбора):

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"));

1 Ответ

1 голос
/ 12 октября 2011

Первое, что мы должны знать, почему createDocument() может быть медленным.Причина в том, что DOM активен, и если вы изменяете его, он запускает повторную проверку дерева DOM и, возможно, перерисовывает сайт.Каждый раз.Но мы могли бы избежать этой ненужной повторной проверки и перерисовки, используя createDocumentFragment () .DocumentFragment не является частью DOM и поэтому не будет вызывать никаких событий.Таким образом, вы можете построить свою полную часть DOM и на последнем шаге добавить ее в дерево DOM.Я думаю, что это самый быстрый способ создания больших деталей DOM.

ОБНОВЛЕНИЕ Я протестировал его в Firefox 7 с помощью Firebug.Код:

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");

Результат: «а» около 140мс и «б» около 35мс.Так что версия для разбора строк медленнее.

UPDATE2 Весьма вероятно, что второй вариант быстрее в любом другом браузере.Потому что метод parse также должен создавать объект DOM и очень вероятно, что он использует те же методы (например: document.createElement).Таким образом, метод разбора не может быть быстрее.Но он медленнее, потому что сначала нужно разобрать строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...