profile对比std::regex与boost::regex的性能
c++11标准库的regex比boost库的regex之间的性能差距接近5倍,这是为什么?stackflow上也找到一篇post《c++11 regex slower than python》,大家在7年前就有讨论了,但是没有一个答案。里面有人给出boost快5倍的例子。
今天就此做一个小小的profile 进行分析对比。
环境:devtoolset-7 on atlarch centos 7,
编译链接:O2优化,boost169 on dnf。
测试内容:100次 regex_search,因为不是benchmark,所以少量100次。测试代码放在结尾。
量化单位:self 栏指令周期,call栏次数。
现在开始分析profile,每张图上面是boost::regex-profile,下面是std::regex-profile。

上图,ld.so可以看作一个进程的基本开销,二者是相当的,所以除去。
测试程序名称是zbuffer,即@MAIN主映像,regex代码内联在这个模块。
主要模块的profile对比
| 模块名 | boost | std |
| @MAIN | 329608 | 3966488 |
| libstdc++ | 577719 | 1527035 |
| libc | 137741 | 913459 |
| libboost_regex | 117581 | 57632 |
主要差距存在前俩, boost约90w,std约450w,接近5倍。
可以直观看出,boost库在@MAIN内联的代码,加上库的执行代码,性能消耗十分少,不到50w,比std::regex程序在libc上消耗的还少的多。std::regex究竟做什么了。

第二张图是主模块的profile对比,std::regex主要消耗在前8项,主要有_Execute,new,delete。
std::regex的_Execute占了120W,new+delete占了180W。
抛开new+delete操作的巨大损耗,std::regex的_Execute的消耗依旧比boost::regex全部消耗高出1倍。

第三张图是libstdc++的profile对比,
boost基本没多少new的操作,std::regex却又大量动态类型操作,损耗50w。这损耗量,boost::regex已经足够完成工作了。

第四张图是libboost_regex的profile。
因为,std::regex测试程序也链接了libboost_regex.so,正好可以观察std::regex又在什么破事情是损耗。boost在这个模块上的消耗时实实在在的,10w+。std::regex测试程序在libstdc++库的std::string::_S_construct被libboost_regex库接替,反过来看,std::regex的std::string多了3400+次的操作。

最后一张图是libc的profile
boost::regex与std::regex的profile对比完结。
测试代码来自网络
int veces = 100;
int count = 0; zlab_allocator<>::inst(); using namespace std;
regex expres ("([^-]*)-([^-]*)-(\\d\\d\\d:\\d\\d)---(.*)\\n",
regex_constants::ECMAScript); std::string text ("some-random-text-453:10--- etc etc blah\n");
smatch macha;
auto start = std::chrono::system_clock::now(); for (int ii = 0; ii < veces; ii ++)
count += regex_search (text, macha, expres); auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - start).count();
std::cout << count << "/" << veces << " matches " << milli << " ms --> " << (milli / (float) veces) << " ms per regex_search" << std::endl;
profile文件放在我的github.com/bbqz007。
profile对比std::regex与boost::regex的性能的更多相关文章
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
工作需要用到C++中的正则表达式,以下三种正则可供参考 1,C regex #include <regex.h> #include <iostream> #include &l ...
- boost::string or boost::regex
有时候写代码时会遇到下面问题 如果有一个文本文件,其包括内容类似于C语言,当中有一行例如以下格式的语句: layout (local_size_x = a,local_size_y = b, loca ...
- vs 2005 使用 boost regex
第一步: Boost 入门及其VS2005下编译boost库 boost.regex库安装指南 深入浅出之正则表达式(一) C++中三种正则表达式比较(C regex,C ++regex,boo ...
- libraries\include\boost-1_61\boost/regex/v4/perl_matcher.hpp(362): error C2292: 'boost::re_detail_106100::perl_matcher<const char *,std::allocator<boost::sub_match<const char *>>,boost::regex_traits<c
这个问题在Windows上基于CMake编译Caffe-SSD的GPU版时出现. 网上找到的博客贴出的解决办法是删掉regex和rv相关代码,甚至不编译detection_output_layer.c ...
- #include <boost/regex.hpp>
boost C++的正则表达式库boost.regex可以应用正则表达式于C++.正则表达式大大减轻了搜索特定模式字符串的负担,在很多语言中都是强大的功能. boost.regex库中两个最重要的类是 ...
- 解决Boost.Regex对中文支持不好的问题
解决Boost.Regex对中文支持不好的问题 - k.m.Cao - 博客频道 - CSDN.NET 解决Boost.Regex对中文支持不好的问题 k.m.Caov0.1 问题的提出: Boo ...
- boost:regex分割字符串(带有'\'字符) - zzusimon的专栏 - 博客频道 - CSDN.NET
boost:regex分割字符串(带有'\'字符) - zzusimon的专栏 - 博客频道 - CSDN.NET boost:regex分割字符串(带有'\'字符) 分类: C++ 2011-08- ...
- 使用Boost Regex 的regex_search进行遍历搜索
在regex_search函数中,会将找到的第一个匹配结果保存到一个smatch类中. 然而如果搜索字符串中有多个匹配结果,则需要自己实现了. 在smatch中,有两个成员,官方文档如下: itera ...
- c++ 使用boost regex库 总结
用java的时候觉得挺折腾,回头来弄c++才知道什么叫折腾...汗... 首先参考我写的这篇文章:http://www.cnblogs.com/qrlozte/p/4100892.html 我从sou ...
随机推荐
- 用Python的Pandas和Matplotlib绘制股票唐奇安通道,布林带通道和鳄鱼组线
我最近出了一本书,<基于股票大数据分析的Python入门实战 视频教学版>,京东链接:https://item.jd.com/69241653952.html,在其中给出了MACD,KDJ ...
- linux,运维,部署 相关
基础 linux基础命令 linux基础 部署 docker
- 群晖系统设置自动拍摄共享文件夹快照的教程【江东网 JDX86.COM】
Snapshot Replication 是数据备份和还原的工具.企业需要数据保护以防止因意外删除.应用程序崩溃.数据损毁和病毒所造成的数据丢失. 1.在套件中心下载该套件 2.打开套件可以看到NAS ...
- Project ACRN documentation
Project ACRN documentation https://projectacrn.github.io/latest/index.html Virtio devices high-level ...
- Linux环境下没有权限操作文件或目录
linux下有超级用户(root)和普通用户,普通用户不能直接操作没有权限的目录,如果出现了没有权限的提示,可以尝试用su命令解决. 比如: #mkdir aaa 我要创建一个aaa的文件夹,没有操作 ...
- CentOS基础操作
一.修改IP地址 vim ../etc/sysconfig/network-scripts/ifcfg-ens33 在文件中修改或添加以下内容 TYPE=Ethernet PROXY_METHOD= ...
- 牛客网PAT练习场-数字分类
签到题 地址:https://www.nowcoder.com/pat/6/problem/4078 #include<iostream> #include<cstdio> u ...
- 阿里面试竟如此轻松,2招带你过关斩将拿下offer
在找工作之前首先是要认清一个问题,虽然这个问题比较俗,但是很现实,就是为什么追求高工资? 这个问题我想不用说大家心里也清楚.大部分人都不是当前城市的本地人,说好听了叫来上班,说的不好听其实叫“外来务工 ...
- 力扣Leetcode 11. 盛最多水的容器
盛最多水的容器 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找 ...
- VS2015+opencv3.1.0 imshow()函数出现中文乱码----问题一
Visual Studio提供高级保存选项功能,它能指定特定代码文件的编码规范和行尾所使用的换行符.在Visual Studio 2015中,该命令没有默认显示在“文件”菜单中.用户需要手工设置,才能 ...