Скорость наше всё?

267
25 февраля 2017, 06:49

Доброго вечера все. Профессионалы и любители JavaScript. Я говорил ранее, что изучаю JS по учебнику "Выразительный JS" Сейчас я нахожусь на главе DOM и иже с ним Там приведён пример как легко с помощью рекурсии сделать поиск в body определённой фразы:

function searchStr(node, string){
    if(node.nodeType === document.ELEMENT_NODE) {
        for (var i = 0; i < node.childNodes.length; i++) 
            if (searchStr(node.childNodes[i], string)) 
               return true;
        return false;
    }
    else if(node.nodeType === document.TEXT_NODE) return 
    node.nodeValue.indexOf(string) > -1
}

Вопрос вот в чём, я не понимаю зачем использовать рекурсию там, где можно использовать обычный код. Вот код, который делает тоже самое, только быстрее.

function searchStr(node, string){
    for(var i=0;i<node.childNodes.length;i++)
        if(node.childNodes[i].nodeType === 3) 
            return node.parentElement.innerText.indexOf(string) > -1;
}

На сам код пофигу, можно сделать немного изящнее, брать родителя сразу, но суть не в этом. Разве так важно пихать рекурсии везде где можно?

Делал сравнение по мс, первый код работает примерно в 5 раз медленнее второго.

Answer 1

Разве так важно пихать рекурсии везде где можно?

Это был риторический вопрос? Нет, не так важно.

Ваше решение не эквивалентно рекурсивному. У Вас возможны false positives, когда искомая строка получается склеиванием двух кусков текста, находящихся в разных элементах.

function searchStrTextbook(node, stringToFind) { 
  if (node.nodeType === document.ELEMENT_NODE) { 
    for (var i = 0; i < node.childNodes.length; i++)  
      if (searchStrTextbook(node.childNodes[i], stringToFind))  
        return true; 
    return false; 
  } else if(node.nodeType === document.TEXT_NODE) { 
    return node.nodeValue.indexOf(stringToFind) > -1; 
  } 
} 
 
function searchStrDenis(node, stringToFind) { 
  return node.parentElement.innerText.indexOf(stringToFind) > -1; 
} 
 
//console.log(document.body.innerText); 
console.log(searchStrTextbook(document.body, "a" + "b")); 
console.log(searchStrDenis(document.body, "a" + "b"));
span{margin:10px;}
Встречается ли в этом документе строка "a" + "b"? 
 
<div><span>aaaa</span><span>bbbb</span></div>

READ ALSO
React и ввод данных в input

React и ввод данных в input

Доброго времени суток! Делаю небольшое приложение на React, опыта пока немногоУ меня два React-класса, один - это навигация, второй - форма редактирования...

307
Вопрос на счёт Ember.run

Вопрос на счёт Ember.run

Всем приветНашел в коде такое

256
Как организовать событие mousePressed jquery?

Как организовать событие mousePressed jquery?

Не получается нормально сделать событие mousePressed (при зажатой кнопки мыши происходит увеличение величины с шагом одна единица), получается...

335