Этот ответ основан на Perl, но все инструменты с тегами должны быть очень похожи в следующем.
Класс символов \w
(для символа «слово») соответствует спецификациям Юникода для свойств символа слова. Это включает в себя так много вещей и сложности, что сложно определить категории включаемых свойств. См. " Символы слова " в perlrecharclass и, например, в этом посте . См. perlunicode и perluniprops для фона.
Короче говоря, это далеко за пределы 63 символов ascii, если только не используется модификатор /a
(или /aa
) или локали.
Тем не менее, речь идет конкретно о производительности. На этом этапе следует ожидать, что различные инструменты будут различаться в поведении, и, возможно, во многих, поскольку это зависит от реализации регулярных выражений. Остальная часть этого поста специально для Perl.
Можно ожидать, что меньший набор может быть быстрее проверен, или можно ожидать, что конструкции типа \w
идут с оптимизацией. Вместо того, чтобы гадать, давайте измерять. Следующее является грубым тестом, нацеленным на разумные выводы, оставляя в стороне несколько нюансов.
use warnings;
use strict;
use feature 'say';
use List::Util qw(shuffle);
use Benchmark qw(cmpthese);
my $run_for = shift // 3; # seconds to run benchmark for
my $str = join '', (shuffle 'a'..'z', 'A'..'Z', 0..9, '_') x 100;
sub word_class {
my $str = shift;
my @m_1 = $str =~ /\w/g;
return \@m_1;
}
sub char_class {
my $str = shift;
my @m_2 = $str =~ /[a-zA-Z0-9_]/g;
return \@m_2;
}
cmpthese(-$run_for, {
word => sub { my $res = word_class ($str) },
char => sub { my $res = char_class ($str) },
});
Строка собирается с использованием [a-zA-Z0-9_]
, которые перемешиваются, а затем повторяются 100 раз. Вся строка соответствует символу за /g
, \w
и [a-zA-Z0-9_]
. Таким образом, в каждом случае это одно регулярное выражение, и они сравниваются.
Результат
Rate char word
char 583/s -- -1%
word 587/s 1% --
Приведенные выше цифры в любом случае в моих тестах возрастают до 2%. Так что без разницы.
Примечание. Я попытался добавить в тестовую строку символы, отличные от ascii, без заметной разницы.
Примечание: регулярное выражение с /g
накапливает совпадения (6300) char после char, но за один запуск двигателя. Другой вариант - повторно проверять совпадение. Они не одинаковы, но независимо от того, что оба будут представлять разницу в производительности между \w
и [a-zA-Z0-9_]
, если они значительны.
Пожалуйста, определите время для себя, чтобы строки и узоры лучше подходили для ваших обстоятельств.
Приведенный выше ориентир должен был быть грубым грубым показателем. Однако, в частности, отсутствуют отрицательные (неудачные) совпадения, в результате чего двигатель должен пройти через все возможности для проверенных шаблонов.
Я проверяю это, вызывая описанные выше подпрограммы для целевой строки, измененной на
$str = join '', qw(! / \ { } ^ % @) x 1_000;
, который не будет соответствовать как \w
, так и [a-zA-Z0-9_]
. Результат
Rate char word
char 72820/s -- -19%
word 89863/s 23% --
Это удивительно для меня, если не сказать больше. Набор \w
настолько велик (см. Ответ икегами), что это должно подразумевать, что происходят серьезные (или «магические») оптимизации.
Это подтверждает мой общий вывод: в целом их производительность достаточно близка, поэтому просто используйте то, что является более подходящим для кодирования; Или время в вашем конкретном сценарии использования.