初步性能测试
因为接下去要做优化工作,在此之前,先做下简单的性能测试。
比较的对象是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/十万次。
结果如下:
匹配速度差很多,解析速度差不多。
考虑到在解析“?”“+”“*”的时候,引入了很多ε边,于是对那部分做点优化,去除不必要的ε边和节点构造,然后再测试:
可以看到有所提高,但是解析速度还是跟std:wregex的差很多,匹配速度有明显领先。目前只解析到ε边、-NFA,如果再做状态机转化,虽然会提高匹配速度,可是解析速度会进一步下降。因此,一开始就要考虑使用一种更高效的状态机存储方法。
这两天着凉生病了,好难受啊……