Wednesday, August 16, 2006

正则表达式的写法和效率一例

#!/usr/bin/perl
use strict;
use warnings;
use Benchmark qw(:all);

my $b = cmpthese( -1,
{
pa => qq("It's a fine day today." =~ /a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z/g),
pb => qq("It's a fine day today." =~ /[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]/g ),
pc => qq("It's a fine day today." =~ /[a-zA-Z]/g ),
}
);

上面的这个例子我一直跑不出个相对稳定的结果,只能随便拿个结果来说明一下:
        Rate   pa   pb   pc
pa 848885/s -- -61% -65%
pb 2204237/s 160% -- -9%
pc 2427045/s 186% 10% --

可以看到,从“或(|)”模式到“类([])”模式,正则匹配的效率可以得到大幅度的提高,如果在“类”中能利用“范围(-)”符的话,还可以有小幅度提升。粗糙地结论就是,正则愈短,效率愈高。

因而在处理特定字符集的情况下,可以将其浓缩成一个精简的字符类描述的话,在执行效率上应该是很有帮助的。

No comments: