Я работаю с проблемой производительности на JavaScript. Поэтому я просто хочу спросить: какой самый быстрый способ проверить, содержит ли строка другую подстроку (мне просто нужно логическое значение)? Не могли бы вы предложить свою идею и пример кода фрагмента?
javascript
regex
substring
Син Хонг Чау
источник
источник
regex
тега)?Ответы:
У вас есть две возможности:
Регулярное выражение :
indexOf
:Регулярные выражения кажутся быстрее (по крайней мере, в Chrome 10).Тест производительности - длинный стог сена
Тест производительности - длинный стог сена
Обновление 2011:
Нельзя с уверенностью сказать, какой метод быстрее. Различия между браузерами огромны. Хотя в Chrome 10
indexOf
кажется быстрее, в Safari 5indexOf
явно медленнее, чем любой другой метод.Вы должны увидеть и попробовать себя. Это зависит от ваших потребностей. Например, поиск без учета регистра намного быстрее с регулярными выражениями.
Обновление 2018:
Просто для того, чтобы избавить людей от запуска самих тестов, вот текущие результаты для большинства распространенных браузеров, проценты указывают на увеличение производительности по сравнению со следующим самым быстрым результатом (который зависит от браузера):
Chrome: indexOf (~ 98% быстрее)
<-- wow
Firefox: кэшированный RegExp (~ 18% быстрее)
IE11: кэшированный RegExp (~ 10% быстрее)
Edge: indexOf (~ 18% быстрее)
Safari: кэшированный RegExp (~ 0,4% быстрее)
Обратите внимание, что кэшированный RegExp это:
var r = new RegExp('simple'); var c = r.test(str);
в отличие от:/simple/.test(str)
источник
indexOf
не работает. Я не уверен почему. Использование Regex, хотя и делает. Это крайний случай, но другие могут столкнуться с той же проблемой.Это работает для вас?
Редактировать: Это не может быть быстрее, чем RegExp, если строка2 содержит повторяющиеся шаблоны. В некоторых браузерах indexOf может быть намного медленнее, чем RegExp. Смотрите комментарии.
Редактировать 2: RegExp может быть быстрее, чем indexOf, когда строки очень длинные и / или содержат повторяющиеся шаблоны. Смотрите комментарии и ответ @ Феликса.
источник
test
.indexOf
это величина медленнее, чем любой другой метод. Так что на самом деле нельзя сказать, какой метод быстрее. Это варьируется от браузера к браузеру.Быстрейший
http://jsben.ch/9cwLJ
источник
В ES6
includes()
метод используется для определения, может ли одна строка быть найдена в другой строке, возвращаемойtrue
или,false
если необходимо.Вот спс между
И
В результате, показанном в jsperf, кажется, что оба они работают хорошо.
источник
str.includes("x|y")
:; ищите литералы "x" или "y" в одном вызове.regex
в нем. Одна работа вокруг вашего вопроса,str.includes("x") || str.includes('y')
indexOf
он значительно быстрееincludes
(более 1600% быстрее). Неясно, как разница в 44 млн. Итераций в секунду и 777+ млн. В секунду влияет на производительность в реальном мире, однако мобильные устройства, скорее всего, выиграют достаточно, чтоindexOf
должно стать идеальным выбором.Я обнаружил, что использование простого цикла for, итерации по всем элементам строки и сравнение с использованием
charAt
выполняется быстрее, чемindexOf
илиRegex
. Код и подтверждение доступны на JSPerf .ETA:
indexOf
иcharAt
оба работают одинаково ужасно на Chrome Mobile в соответствии с данными Browser Scope, перечисленными на jsperf.comисточник
Чтобы найти простую строку, используйте метод indexOf () и регулярное выражение - это почти одно и то же: http://jsperf.com/substring - так что выбирайте тот, который легче написать.
источник
Я сделал jsben.ch для вас http://jsben.ch/#/aWxtF ... кажется, что indexOf немного быстрее.
источник
Это простой способ использовать
.match()
метод для строки.Желаю вам хорошего дня, сэр!
источник
match
когда естьtest
метод ... Проверьте верхний ответ.