Javascript: Regex vs IndexOf при сканировании списка ключевых слов

Я вижу, что indexOf работает быстрее, когда вы сканируете одно слово в соответствии с решением здесь JavaScript: indexOf и Match при поиске строк?

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

Ниже будет быстрее?

var list1 = ['word1', 'word2','word3','word4','word5'];
for (var i = 0; i < list1.length; i++){
     if (exampleLargeText.indexOf(list1[i]) > -1){
    keywordCounter++;
    }
} 

vs....

var keywordRegex =  'word1|word2|word3|word4|word5'];  
var keywordCounter = exampleLargeText.toLowerCase().match(new RegExp(SUBMIT_ELEMENT_REGEX , "ig")) || []).length

Является ли indexOf() по-прежнему быстрее, несмотря на то, что вы сканируете exampleLargeText 5 раз?


person Arrow    schedule 19.08.2015    source источник
comment
Попробуй это. Это единственный способ узнать.   -  person Bergi    schedule 19.08.2015


Ответы (1)


Регулярное выражение, такое как /aaa|bbb|ccc/, никогда не будет более эффективным, чем более простое (но все же похожее, состоящее из 3 символов) выражение, такое как /abc/. Это связано с тем, что механизмы регулярных выражений соответствуют слева направо. Самым простым совпадением будет «aaa» для первого и «abc» для второго... каждое из них занимает 3 шага. Теперь представьте, что вы пытаетесь сопоставить 'aabbccx' с обоими выражениями. Первое выражение займет в общей сложности 33 шага, а второе — 5 шагов, потому что каждое чередование (обозначаемое |) заставляет механизм регулярных выражений начинать заново. Поэкспериментируйте с этим с помощью такого инструмента, как Regex101.

Однако, если бы вы смогли сделать свое регулярное выражение более оптимизированным, а не просто проверять каждое слово по отдельности, есть шанс, что оно превзойдет .indexOf(). Например, если ваше выражение действительно /word1|word2|word3|word4|word5/, его можно переписать как /word[1-5]/. Это намного эффективнее, чем поиск каждого слова по отдельности, потому что теперь выражение определяется по простому шаблону. Кто знает, однако, .indexOf() все еще может быть быстрее в зависимости от накладных расходов.

Вот когда в игру вступает бенчмаркинг — используйте jsPerf!

person Sam    schedule 19.08.2015