标签:技术 null fun bool 搜索字符串 oid 运行 正则 int
测试平台 (虚拟机)
系统: ubuntu 15.1
编译器版本:
g++ --version
g++ 5.2.1
boost版本: boost 1.59
1.正则表达式 regex
正则表达式一般用来匹配搜索字符串。
下面是测试代码。
c++11版本 test_regex.cpp
#include
#include
#include
#include
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
编译命令g++ test_regex.cpp -o test_regex -std=c++11 -O2
boost版本
#include
#include
#include
#include
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
编译命令 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
#include
#include
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
#include
#include
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对比
标签:技术 null fun bool 搜索字符串 oid 运行 正则 int
原文地址:https://www.cnblogs.com/summer010/p/11025650.html