boost和c++11的正则表达式regex和线程thread对比

Posted summer010

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost和c++11的正则表达式regex和线程thread对比相关的知识,希望对你有一定的参考价值。

测试平台 (虚拟机)

系统: ubuntu 15.1

编译器版本:

g++ --version
g++ 5.2.1

boost版本: boost 1.59

 

1.正则表达式 regex

正则表达式一般用来匹配搜索字符串。

下面是测试代码。

c++11版本 test_regex.cpp

#include <stdio.h>
#include <regex>
#include <string>
#include <time.h>

bool matchIp(const std::string &message)

    try 
		std::regex m_p("^(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[1-9])\\\\.(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[1-9]|0)\\\\.(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[1-9]|0)\\\\.(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[0-9])$");

		return std::regex_match(message, m_p);
    
    catch (std::exception &ex)
	
		printf("std::regex err: %s", ex.what());
		return false;
	


int main()

    setbuf(stdout, NULL);
    std::string ip = "192.168.0.128";
    std::string ip2 = "192.aaa168.0.128";
    
    clock_t start,end;
    start=clock();
    
    for(int i = 0; i < 1000; i++)
    
        bool match = matchIp(ip);
        bool match2 = matchIp(ip2);
        //printf("match:%d, match2:%d\\n", (int)match, (int)match2);
    
    
    end=clock();
    printf("Thetimewas:%f\\n",(double)(end-start)/CLOCKS_PER_SEC);
    
    return 0;

  编译命令g++ test_regex.cpp -o test_regex -std=c++11 -O2

boost版本

#include <stdio.h>
#include <boost/regex.hpp>
#include <string>
#include <time.h>

bool matchIp(const std::string &message)

    try 
		boost::regex m_p("^(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[1-9])\\\\.(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[1-9]|0)\\\\.(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[1-9]|0)\\\\.(25[0-5]|2[0-4][0-9]|[0-1]1[0-9]2|[1-9]1[0-9]1|[0-9])$");

		return boost::regex_match(message, m_p);
    
    catch (std::exception &ex)
	
		printf("boost::regex err: %s", ex.what());
		return false;
	


int main()

    setbuf(stdout, NULL);
    std::string ip = "192.168.0.128";
    std::string ip2 = "192.aaa168.0.128";
    
    clock_t start,end;
    start=clock();
    
    for(int i = 0; i < 1000; i++)
    
        bool match = matchIp(ip);
        bool match2 = matchIp(ip2);
        //printf("match:%d, match2:%d\\n", (int)match, (int)match2);
    
    
    end=clock();
    printf("Thetimewas:%f\\n",(double)(end-start)/CLOCKS_PER_SEC);
    return 0;

  编译命令 g++ test_boost_regex.cpp -g -o test_boost_regex -I /boost_1_59_0/ /boost_1_59_0/stage/lib/libboost_regex.a /boost_1_59_0/stage/lib/libboost_system.a -O2

同样是匹配ip,循环1000次,时间对比

技术图片

boost正则比c++11标准库正则 快了40倍!

 

2.线程 thread 测试

c++11 版本

#include <stdio.h>
#include <thread>
#include <stdexcept>

void func5();
void func2();
void func3(int &a);
void func4();
void func5();


void func1()

    func2();

void func2()

    int a = 2;
    func3(a);
    

void func3(int &a)

    func4();

void func4()

    func5();

void func5()

    throw std::runtime_error("test exception");



int main()

    std::thread t(&func1);
    t.join();
    return 0;

编译命令: g++ test_thread.cpp -o test_thread -O2 -std=c++11 -lpthread -g -lrt

运行后会直接异常退出,这是我们期望的。

用gdb查看运行

gdb ./test_thread

技术图片

我们代码里的异常抛出的位置信息、调用堆栈完全没有了。

 

boost版本

#include <stdio.h>
#include <boost/thread.hpp>
#include <stdexcept>

void func5();
void func2();
void func3(int &a);
void func4();
void func5();


void func1()

    func2();

void func2()

    int a = 2;
    func3(a);
    

void func3(int &a)

    func4();

void func4()

    func5();

void func5()

    throw std::runtime_error("test exception");



int main()

    boost::thread t(&func1);
    t.join();
    return 0;

  

编译命令: g++ test_boost_thread.cpp -g -o test_boost_thread -I /boost_1_59_0 /boost_1_59_0/stage/lib/libboost_thread.a /boost_1_59_0/stage/lib/libboost_system.a  -lpthread -lrt -O2

同样执行test_boost_thread 会异常退出。

用gdb调试

gdb ./test_boost_thread

技术图片

可以清晰地看到

#7 0x0804a9dd in func5 () at test_boost_thread.cpp:32
#8 0x0804aa38 in func1() () at test_boost_thread.cpp:28

正是代码里抛出异常的地方,非常方便定位问题。

 

线程部分的结论是,(该版本)c++11 标准库线程thread会吞掉异常堆栈,假如出了问题想排查原因,将会非常困难。

 

以上是关于boost和c++11的正则表达式regex和线程thread对比的主要内容,如果未能解决你的问题,请参考以下文章

[C/C++11]_[初级]_[使用正则表达式库regex]

boost库之正则表达式regex

正则表达式搜索匹配不使用组

C/C++学院0904-boost智能指针/boost多线程锁定/哈希库/正则表达式

使用 Boost::regex 进行正则表达式组匹配

Boost之正则表达式Regex库的使用方法