А что для JS проще — простое условие или регэксп?

Вот например, (x == 'a' || x == 'b' || x == 'c') или x.match(/^(?:a|b|c)$/)?
  • Вопрос задан
  • 2584 просмотра
Пригласить эксперта
Ответы на вопрос 10
SerDIDG
@SerDIDG
В данном случае экономичнее будет так:

/^(a|b|c)$/.test(x);
Ответ написан
@krasulya
Сделал несколько измерений в хроме.

var x = '1',
times = 10000,
start1 = +new Date();
for (var i=0; i<times; i++) {
if (x == 'a' || x == 'b' || x == 'c') {

}
}
var time1 = +new Date() - start1,
start2 = +new Date();
for (var i=0; i<times; i++) {
if (x.match(/^(?:a|b|c)$/)) {

}
}
var time2 = +new Date() - start2;
console.log(time1, time2)


В среднем, первый вариант (10000 тысяч обычных сравнений) выполняется за 30-45 мс. Второй — 20-25.

Если x будет равно 'a', то каждый раз будет будет проверяться только x == 'a' и тогда первый вариант проходит за 25-35 мс. Т.е. в данном конкретном примере выигрывают регекспы.

Но в других случаях результат может быть другим.
Ответ написан
mark_ablov
@mark_ablov
Странные у вас тесты и результаты.
jsperf.com/if-vs-regexp-match
Конечно же, if быстрее на порядок.
Ответ написан
Meliborn
@Meliborn
Регулярное выражение — это вызов функции, а это более затратный процесс.
Ответ написан
Комментировать
barmaley_exe
@barmaley_exe
Что значит «проще»? Выполняется быстрее? Конечно же первое, т.к. регэкспы надо сначала скомпилировать, потом работать с ними… Это явно сложнее, чем просто сравнить строчки.
А вообще, мне кажется, это какая-то экономия на спичках. Почему Вам так важна производительность этого кода?
Ответ написан
Комментировать
neosys
@neosys
Лучше использовать обычные условия. Да, на регекспах вы можете выиграть 1-10 мс, но это сделает ваш код настолько плохо-читаемым, что это заставляет задуматься а стоит ли игра свеч.
Ответ написан
Комментировать
@gro
Использование "===" вместо "==" позволит первому варианту выиграть ещё убедительнее в этом бессмысленном соревновании (в FF по крайней мере).
Ответ написан
Я бы использовал что-то в этом духе:
if (possibleValues.indexOf(item)) >= 0


Вопрос крайне глупый. Напишите так, как легче всего поддерживать и быстрее всего расширять, а при необходимости проходитесь профайлером и ищите узкие места.
Ответ написан
Комментировать
Keenest
@Keenest
в данном случае без разницы. разве что у вас такие проверки настолько часто выполняются, что это сказывается на производительности.
с if'ами несколько нагляднее, но в некоторых ситуациях без регулярных выражений будет тяжко.
вот например, я использую функцию для проверки — является ли строка валидным e-mail'ом:
return /^[0-9a-z_\.]+@[0-9a-z_\^\.]+\.[a-z]{2,6}$/i.test(s);

if'ами вышло бы ой как тяжко)
Ответ написан
@XimikS
ну, в современных движках браузеров регэскпы компилятся, и после очень быстрые, так что, если вам надо использовать где-то в цикле, лучше регексп =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы