2014-10-17 2 views
0

Если у меня есть узел, как это:Является ли таблица хэшей быстрее, чем document.getElementById?

<!-- lots of HTML here (including lots of nest unordered lists) --> 
    <span id="spn123">Test</span> 
    <!-- lots of html here --> 

похороненных под большим количеством уровней HTML, и я также иметь JavaScript хэш-таблицу, как это:

[ 
/* lots of nodes here */ 
{ 123 : 'Test' } 
/* lots of nodes here */ 
] 

Тогда было бы быстрее использовать

document.getElementById('spn123').innerText; 

или

data(123) 

Я бы предположил, что оба обработаны браузером изначально и очень оптимизированы, но будет ли последний быстрее из-за его плоской структуры и отсутствия дополнительного раздувания DOM?

Спасибо!

+3

Бенчмарк. Это будет зависеть от * конкретных * DOM и JS-реализаций. В конце концов, это не имеет значения: если сам алгоритм, вероятно, должен быть пересмотрен. (Оба эти варианта использования были хорошо оптимизированы. Кроме того, объекты JavaScript - это * не * хэш-таблицы, они являются картами. Реализации * могут * выбирать использовать хэширование внутри себя.) – user2864740

+0

Разница будет тривиальной, если вы не говорите о миллиардах операций. Если вы говорите о миллиардах операций, вы, вероятно, делаете что-то странное. – Pointy

+0

На все вопросы, связанные с производительностью, следует ответить, проверив хорошо спроектированные тесты, которые точно определяют, что вам нужно в браузерах, о которых вы им заботитесь. Все остальное - чистая спекуляция. – jfriend00

ответ

3

Возможно, было полезно узнать, почему у вас есть как объект, так и представление DOM. Я предполагаю, что хэш является единственным источником правды, а DOM соответственно делает хэш.

Я бы ожидал, что поиск хэша будет быстрее, потому что DOM может быть медленным, однако это в основном запись DOM, а не чтение DOM. Я сделал JS Perf, и результаты сильно варьируются в зависимости от браузера.

В этих случаях, я хотел бы сделать функцию абстрактной реализации, поэтому он может быть изменен позже, не находя все ссылки на поиск в коде:

function getItem(id) { 
    return hash[id]; 
} 

Если позже вы найдете более оптимизированный способ для поиска ваших данных вы просто меняете эту функцию.

Обновление: Я изменил jsperf, чтобы использовать textContent, но это не будет работать в старых браузерах.

+0

Вот что я подумал - все это будет в DOM, но я предпочел бы просто использовать плоскую карту хэша, чтобы посмотреть ее , – JoeS

+1

hashmap медленнее на Chrome, имеет такую ​​же скорость на FF, но быстрее на Safari == >> нет вывода. http://jsperf.com/dom-vs-hash-lookup/2 – GameAlchemist

+0

Спасибо! Это гораздо лучший ответ. – user2864740

2

Я думаю, что ответ на ваш вопрос: «Это не имеет значения».

Моя мысль заключается в том, что, как говорили комментаторы, вы можете как-то сравнить ее.

Однако, если я не ошибаюсь, document.getElementById - это самый быстрый способ выбрать один элемент на вашей странице; нет необходимости пытаться оптимизировать его, если количество операций, которые вы выполняете, является экстремальным.

0

, но будет ли последний быстрее из-за его плоской структуры и отсутствия дополнительного раздувания DOM?

Если кто-то значительно и заметно медленнее, чем другой, используйте тот, который имеет наибольший смысл. Объекты предназначены для хранения и извлечения данных (среди прочего), DOM предназначен для визуального представления.

Так что используйте объект для хранения и извлечения данных, используйте DOM, чтобы отобразить его значимым образом.

Смежные вопросы