【发布时间】:2019-07-16 21:36:08
【问题描述】:
尝试一些正则表达式性能测试(听到一些传言说 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:
如果要在程序的生命周期内使用同一个表达式匹配多个主题,则在匹配之前编译正则表达式很有用。编译一次执行多次,比每次想匹配都要编译效率高得多。
问题
- 为什么它返回微秒?(应该是毫秒?)
- 编译正则表达式没有太大区别,为什么?
- 我应该编译它吗?
【问题讨论】:
标签: regex performance erlang