Попытка некоторых тестов производительности регулярных выражений (слышал некоторые слухи, что erlang работает медленно)
>Fun = fun F(X) -> case X > 1000000 of true -> ok; false -> Y = X + 1, re:run(<<"1ab1jgjggghjgjgjhhhhhhhhhhhhhjgdfgfdgdfgdfgdfgdfgdfgdfgdfgdfgfgv">>, "^[a-zA-Z0-9_]+$"), F(Y) end end.
#Fun<erl_eval.30.128620087>
> timer:tc(Fun, [0]).
{17233982,ok}
> timer:tc(Fun, [0]).
{17155982,ok}
и некоторые тесты после компиляции регулярных выражений
{ok, MP} = re:compile("^[a-zA-Z0-9_]+$").
{ok,{re_pattern,0,0,0,
<<69,82,67,80,107,0,0,0,16,0,0,0,1,0,0,0,255,255,255,
255,255,255,...>>}}
> Fun = fun F(X) -> case X > 1000000 of true -> ok; false -> Y = X + 1, re:run(<<"1ab1jgjggghjgjgjhhhhhhhhhhhhhjgdfgfdgdfgdfgdfgdfgdfgdfgdfgdfgfgv">>, MP), F(Y) end end.
#Fun<erl_eval.30.128620087>
> timer:tc(Fun, [0]).
{15796985,ok}
>
> timer:tc(Fun, [0]).
{15921984,ok}
http://erlang.org/doc/man/timer.html:
Если не указано иное, время всегда измеряется в миллисекундах.
http://erlang.org/doc/man/re.html#compile-1:
Компиляция регулярного выражения перед сопоставлениемполезно, если одно и то же выражение должно использоваться при сопоставлении с несколькими предметами в течение всей жизни программы.Компиляция один раз и многократное выполнение гораздо эффективнее, чем компиляция каждый раз, когда нужно найти соответствие.
Вопросы
- Почему он возвращает микросекунды вменя? (должно быть в миллисекундах?)
- Компиляция регулярных выражений не имеет большого значения, почему?
- Должен ли я беспокоиться о его компиляции?