Я працюю з проблемою продуктивності на 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тегу)?