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的性能的更多相关文章

  1. C++中三种正则表达式比较(C regex,C ++regex,boost regex)

    工作需要用到C++中的正则表达式,以下三种正则可供参考 1,C regex #include <regex.h> #include <iostream> #include &l ...

  2. boost::string or boost::regex

    有时候写代码时会遇到下面问题 如果有一个文本文件,其包括内容类似于C语言,当中有一行例如以下格式的语句: layout (local_size_x = a,local_size_y = b, loca ...

  3. vs 2005 使用 boost regex

    第一步: Boost 入门及其VS2005下编译boost库  boost.regex库安装指南  深入浅出之正则表达式(一)  C++中三种正则表达式比较(C regex,C ++regex,boo ...

  4. 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 ...

  5. #include <boost/regex.hpp>

    boost C++的正则表达式库boost.regex可以应用正则表达式于C++.正则表达式大大减轻了搜索特定模式字符串的负担,在很多语言中都是强大的功能. boost.regex库中两个最重要的类是 ...

  6. 解决Boost.Regex对中文支持不好的问题

    解决Boost.Regex对中文支持不好的问题 - k.m.Cao - 博客频道 - CSDN.NET 解决Boost.Regex对中文支持不好的问题 k.m.Caov0.1   问题的提出: Boo ...

  7. boost:regex分割字符串(带有'\'字符) - zzusimon的专栏 - 博客频道 - CSDN.NET

    boost:regex分割字符串(带有'\'字符) - zzusimon的专栏 - 博客频道 - CSDN.NET boost:regex分割字符串(带有'\'字符) 分类: C++ 2011-08- ...

  8. 使用Boost Regex 的regex_search进行遍历搜索

    在regex_search函数中,会将找到的第一个匹配结果保存到一个smatch类中. 然而如果搜索字符串中有多个匹配结果,则需要自己实现了. 在smatch中,有两个成员,官方文档如下: itera ...

  9. c++ 使用boost regex库 总结

    用java的时候觉得挺折腾,回头来弄c++才知道什么叫折腾...汗... 首先参考我写的这篇文章:http://www.cnblogs.com/qrlozte/p/4100892.html 我从sou ...

随机推荐

  1. OVS DPDK VXLAN隧道处理

    原文链接: OVS DPDK VXLAN隧道处理

  2. gorm demo

    package main import ( "fmt" "github.com/jinzhu/gorm" _ "github.com/jinzhu/g ...

  3. 斗地主小游戏随机发牌PHP代码

    <?php header("Content-Type:text/html;charset=UTF-8"); $num=['A','2','3','4','5','6','7' ...

  4. 键盘敲入 A 字母时,操作系统期间发生了什么

    前言 键盘可以说是我们最常使用的输入硬件设备了,但身为程序员的你,你知道「键盘敲入A 字母时,操作系统期间发生了什么吗」? 那要想知道这个发生的过程,我们得先了解了解「操作系统是如何管理多种多样的的输 ...

  5. Python最火的第三方开源测试框架 ——pytest

    一.介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest.它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了) 自 ...

  6. URL与视图函数的映射

    今天跟大家讲的是URL与视图函数的映射 URL与视图函数的映射 url与视图函数的映射是通过@app.route()装饰器实现的. 1.只有一个斜杠代表的是根目录——首页. # coding: utf ...

  7. 数字电路基础(三)TTL与非门输入端接电压表的示数

    如下图所示,当ui输入低电平,电压表示数为0.3v,当ui输入高电平时,电压表示数为1.4v,分析如下 当ui=0.3 此时VT1导通,电流都从输入端流出,VT1的基极电位被钳位在1.0v(Ub1=0 ...

  8. oeasy教你玩转linux010104灵魂之问whatis

    灵魂之问whatis 回忆上节课 我们上次在系统里面乱转

  9. 【HttpRunner v3.x】笔记 ——4. 测试用例-结构解析

    一.官方首推pytest格式 上篇文章我们知道了,httprunner可以支持三种格式的用例,分别是pytest.yaml和json.yaml和json是以前的版本所使用的用例格式,但是在3.x版本上 ...

  10. Activiti7 流程变量(UEL-Value方式)

    需求:请假天数大于3天走总经理审批,小于等于3天直接走人事 画图 因为IDEA不展示那个线上的东西,所以截屏自己写的,还有就是我感觉IDEA画图挺坑的,之前画了好几遍,一部署就报错,很奇怪 /** * ...