Я працюю з проблемою продуктивності на JavaScript. Тому я просто хочу запитати: який найшвидший спосіб перевірити, чи містить рядок іншу підрядку (мені просто потрібне булеве значення)? Ви можете запропонувати свою ідею та зразок коду фрагмента?
Я працюю з проблемою продуктивності на JavaScript. Тому я просто хочу запитати: який найшвидший спосіб перевірити, чи містить рядок іншу підрядку (мені просто потрібне булеве значення)? Ви можете запропонувати свою ідею та зразок коду фрагмента?
Відповіді:
У вас є дві можливості:
(new RegExp('word')).test(str)
// or
/word/.test(str)
str.indexOf('word') !== -1
Регулярні вирази здаються швидшими (принаймні в Chrome 10).
Тест на продуктивність - короткий стог сіна.
Тест на ефективність - довгий стог сіна
Не можна з впевненістю сказати, який метод швидший. Відмінності між браузерами величезні. Хоча в Chrome 10, indexOf
здається, швидше, у Safari 5 indexOf
явно повільніше, ніж будь-який інший метод.
Ви повинні побачити і спробувати себе. Це залежить від ваших потреб. Наприклад, нечутливий до регістру пошук проходить швидше за допомогою регулярних виразів.
Оновлення 2018 року:
Просто, щоб врятувати людей від запуску тестів, ось поточні результати для більшості звичайних веб-переглядачів, відсотки вказують на підвищення продуктивності за наступний найшвидший результат (який залежить від браузерів):
Chrome: indexOf (~ 98% швидше) <-- wow
Firefox: кешований RegExp (~ 18% швидше)
IE11: кешований RegExp (~ 10% швидше)
Край: indexOf (~ 18% швидше)
Safari: кешований RegExp (~ 0,4% швидше)
Зауважте, що кешований RegExp є: var r = new RegExp('simple'); var c = r.test(str);
на відміну від:/simple/.test(str)
indexOf
не працює. Я не впевнений, чому. Використання Regex хоча. Це кращий випадок, але інші можуть зіткнутися з тією ж проблемою.
Це працює для вас?
string1.indexOf(string2) >= 0
Правка: Це може бути не швидше, ніж RegExp, якщо рядок2 містить повторювані шаблони. У деяких браузерах indexOf може бути набагато повільніше, ніж RegExp. Дивіться коментарі.
Редагувати 2: RegExp може бути швидшим, ніж indexOf, коли рядки дуже довгі та / або містять повторювані шаблони. Дивіться коментарі та відповідь @ Фелікса.
test
.
indexOf
- на величину повільніше, ніж будь-який інший метод. Тож насправді не можна сказати, який метод швидший. Він залежить від браузера до браузера.
Найшвидший
var string = "привіт", substring = "lo"; string.includes (підрядка);
var string = "привіт", substring = "lo"; string.indexOf (підрядка)! == -1;
У ES6 includes()
метод використовується для визначення того, чи може одна рядок знаходитися в іншій рядку, повертається true
або false
як доречно.
var str = 'To be, or not to be, that is the question.';
console.log(str.includes('To be')); // true
console.log(str.includes('question')); // true
console.log(str.includes('nonexistent')); // false
Ось jsperf між
var ret = str.includes('one');
І
var ret = (str.indexOf('one') !== -1);
Як результат, показаний у jsperf, схоже, що вони обидва добре.
str.includes("x|y")
:; пошук літералів "x" або "y" в одному дзвінку.
regex
його. Один обхід для вашого питання,str.includes("x") || str.includes('y')
indexOf
значно швидше includes
(на 1600% швидше). Незрозуміло, як різниця в 44 мільйони ітерацій на секунду та 777+ мільйонів в / с впливає на продуктивність у реальному світі, проте мобільний, ймовірно, достатньо вигод, який indexOf
повинен бути ідеальним вибором.
Я виявив, що за допомогою простого циклу ітерація над усіма елементами рядка та порівняння з використанням 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()
метод для рядку.
var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));
Бажаю вам приємного дня, сер!
match
коли існує test
метод… Перевірте верхню відповідь.
regex
тегу)?