Является ли регулярное выражение более эффективным, чем проверка ключа в объекте как набора?

1

Итак, в JavaScript мне нужно проверить простой и быстрый способ проверить, принадлежит ли строка длины 1 некоторому набору символов, например, это строковый символ для идентификатора javascript?

Я написал следующий тест:

//performance test for matching

var re = /[a-zA-Z$_]/;

console.time("regex");
for(var i=0;i<100000;i++) re.test("_");
console.timeEnd("regex");

var objs = {"_":true, 0:true, 1:true, 2:true, 3:true, 4:true, 5:true, 6:true, 7:true, 8:true, 9:true, a:true, b:true, c:true, d:true, e:true, f:true, g:true, h:true, "i":true, j:true, k:true, 
  l:true, m:true, n:true, o:true, p:true, q:true, r:true, t:true, $:true
};


console.time("objcheck");
for(var i=0;i<100000;i++) "_" in objs;
console.timeEnd("objcheck");
/*
regex: 10ms
objcheck: 1ms
*/

Что-то странное здесь, на постоянной основе, проверка ключа в объекте, который определен как набор, казался намного быстрее, чем выполнение одного регулярного регулярного символа. Почему это так? Разве регулярное выражение не должно быть быстрее здесь?

  • 1
    Что заставляет вас думать, что это должно?
  • 0
    Ваш микробенчмарк довольно несовершенен, не верьте ему. Оцените свое реальное приложение, используя два разных подхода.
Показать ещё 3 комментария
Теги:

1 ответ

0
Лучший ответ

По вашим данным, нет; Регулярное выражение не быстрее, чем множество.

Это связано с тем, что регулярное выражение необходимо скомпилировать до его запуска. Хотя вы могли бы улучшить эти числа, предварительно компилируя регулярное выражение, регулярное выражение является более общей целью, чем набор или простой старый цикл, поэтому меньшее количество оптимизаций может быть сделано им интерпретатором.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню