随笔-90  评论-947  文章-0  trackbacks-0

因为接下去要做优化工作,在此之前,先做下简单的性能测试。

比较的对象是std::regex,暂时只比较两项:

1、解析正则表达式的速度

2、使用解析好的正则表达式去匹配字符串的速度。

测试代码如下: 

SECTION_BEGIN(StdRegExParse100000);

PERFORMANCE_TEST_BEGIN(StdRegExParse100000);

for (int i = 0; i < 100000; ++i)

{

    wregex r;

    r.assign(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/");

}

PERFORMANCE_TEST_END(StdRegExParse100000);

SECTION_END();

 

SECTION_BEGIN(xlRegExpParse100000);

PERFORMANCE_TEST_BEGIN(xlRegExpParse100000);

for (int i = 0; i < 100000; ++i)

{

    RegExp r;

    r.Parse(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/");

}

PERFORMANCE_TEST_END(xlRegExpParse100000);

SECTION_END();

 

SECTION_BEGIN(StdRegExMatch100000);

{

    wregex r;

    r.assign(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/");

    PERFORMANCE_TEST_BEGIN(StdRegExMatch100000);

    for (int i = 0; i < 100000; ++i)

    {

        regex_match(L"http://w-1.w-2.w-3.streamlet.org/", r);

    }

    PERFORMANCE_TEST_END(StdRegExMatch100000);

}

SECTION_END();

 

SECTION_BEGIN(xlRegExpMatch100000);

{

    RegExp r;

    r.Parse(L"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/");

    PERFORMANCE_TEST_BEGIN(xlRegExpMatch100000);

    for (int i = 0; i < 100000; ++i)

    {

        r.Match(L"http://w-1.w-2.w-3.streamlet.org/");

    }

    PERFORMANCE_TEST_END(xlRegExpMatch100000);

}

SECTION_END();

 

前两则是分别使用std::wregex和xl::RegExp解析"http://([a-zA-Z0-9\\-]+.)+[a-zA-Z]+/"十万次,后两则是拿来匹配http://w-1.w-2.w-3.streamlet.org/十万次。

结果如下:

image

匹配速度差很多,解析速度差不多。

考虑到在解析“?”“+”“*”的时候,引入了很多ε边,于是对那部分做点优化,去除不必要的ε边和节点构造,然后再测试:

image

可以看到有所提高,但是解析速度还是跟std:wregex的差很多,匹配速度有明显领先。目前只解析到ε边、-NFA,如果再做状态机转化,虽然会提高匹配速度,可是解析速度会进一步下降。因此,一开始就要考虑使用一种更高效的状态机存储方法。

这两天着凉生病了,好难受啊……

posted on 2012-06-13 23:00 溪流 阅读(506) 评论(0)  编辑 收藏 引用 所属分类: C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理