jQuery - Повышение производительности селектора при обработке XML - PullRequest
4 голосов
/ 31 января 2012

Я обрабатываю файл XML с очень низкой производительностью при выборе узлов с селекторами стиля XPath.

Вот часть кода, которая работает особенно медленно

for (i=0;i<lanes.length;i++)
    htmlContents += GetLaneInfo($(this).find("Lane[num='"+lanes[i]+"']").attr('avg'));

Я считаю, что самой медленной частью этого кода является селектор Lane[num=X], как я могу улучшить производительность этого? Могу ли я кешировать $(this).find("Lanes"), а потом искать по ним?

Пример XML:

<Data time="10:50">
    <Lane num="102" avg="2.0"/>
    <Lane num="103" avg="2.0"/>
    <Lane num="104" avg="2.0"/>
    <Lane num="112" avg="2.0"/>
    <Lane num="113" avg="2.0"/>
    <Lane num="114" avg="2.0"/>
    <Lane num="115" avg="2.0"/>
    <Lane num="122" avg="0.9"/>
    <Lane num="123" avg="1.0"/>
    <Lane num="124" avg="1.0"/>
    <Lane num="132" avg="0.7"/>
    <Lane num="134" avg="0.7"/>
    <Lane num="142" avg="0.8"/>
    <Lane num="153" avg="0.4"/>
    <Lane num="154" avg="0.6"/>
</Data>

Ответы [ 4 ]

2 голосов
/ 31 января 2012

попробуйте это:

http://jsperf.com/1f

Мне удалось увеличить скорость. enter image description here

p.s. это основано на том факте, что в каждом xml-узле все дорожки находятся в одинаковом порядке.

1 голос
/ 31 мая 2012

Я знаю, что уже поздно, но вот жизнеспособное высокопроизводительное решение:

http://jsperf.com/1f/3

enter image description here

1 голос
/ 31 января 2012

Использование анализа XML для такой простой разметки - пустая трата времени. Если вам нужна скорость, используйте indexOf и подстрока - лучший метод.

http://jsperf.com/1f/2

Я отредактировал jsperf @Royi Namir и добавил свою собственную версию (метко названную "screw xml"). Он работает в 2 раза быстрее, чем его оптимизированная версия для разбора XML.

Вот код, который будет соответствовать примеру ОП из вопроса. Переменная «xml» - это просто строка, представляющая XML.

var find = '';
var start = -1;
var end = -1;
var skip1 = 0;
var skip2 = ' avg="'.length;
//
for (i=0;i<lanes.length;i++) {
  find = 'num="' + lanes[i] + '"';
  skip1 = find.length;
  end = -1;
  start = xml.indexOf(find, 0);
  while (start != -1) {
    start = start + skip1 + skip2;
    end = xml.indexOf("\"/>", start);
    htmlContents += GetLaneInfo(xml.substring(start, end));
    start = xml.indexOf(find, end);
  }
}

В действительности вы, вероятно, не хотите использовать версию, подобную приведенной выше, потому что она зависит от того, как XML отформатирован равномерно (см .: переменная / константа "skip2"). Но если вы действительно хотите, чтобы производительность / скорость выполнялись таким образом, это самый быстрый вариант.

0 голосов
/ 31 января 2012

Что ж, в вашем примере xml данных мы можем видеть, что атрибут num отсортирован, если это так, попробуйте реализовать http://en.wikipedia.org/wiki/Bisection_method для этих данных:)

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