免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2513 | 回复: 4

[C++] gcc的c++11支持,似乎并没有让sort和swap更快? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
发表于 2016-12-07 22:45 |显示全部楼层
本帖最后由 cdsfiui 于 2016-12-07 23:00 编辑

C++11里面swap可以采取move()来避免拷贝,使得std::sort能否更快。

然后我做了一个实验来验证这个说法:
1. 我首先构造了一个vector,有10240000个元素,里面填入随机字符串(由randomString函数生成)。
2. 开始计时,用std::sort排序这个vector,结束计时。
  1. #include<string>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<cstdlib>
  5. #include<cstdio>
  6. #include<iostream>
  7. #include<ctime>
  8. using namespace std;
  9. string randomString()
  10. {
  11.   int iBuf[10];
  12.   for(size_t i=0;i<10;++i)
  13.   {
  14.     double rand0to1=(double)rand()/RAND_MAX;
  15.     iBuf[i]=rand0to1*92+33;
  16.   }
  17.   char ret[6];
  18.   snprintf(ret, 6, "%c%c%c%c%c\n",
  19.     iBuf[0],iBuf[1],iBuf[2],iBuf[3],iBuf[4]);
  20.   return ret;
  21. }
  22. int main()
  23. {
  24.   srand(time(NULL));
  25.   const size_t scale=10240000;
  26.   vector<string> vs;
  27.   vs.reserve(scale);
  28.   for(size_t i=0;i<scale;++i)
  29.   {
  30.     vs.push_back(randomString());
  31.   }
  32.   cout<<vs.size()<<"结束构造\n";
  33.   clock_t begin=clock();
  34.   sort(vs.begin(),vs.end());
  35.   clock_t end=clock();
  36.   double duration=(double)(end-begin)/CLOCKS_PER_SEC;
  37.   cout<<"sort "<<scale<<"个元素耗时"<<duration<<"秒\n";
  38.   return 0;
复制代码

我采用两种方式编译和运行它
g++ testSort.cpp -O2 && ./a.out
g++ testSort.cpp -O2 -std=c++11 && ./a.out

发现运行的结果打印出来,几乎只有毫秒的差别,在我的本子上都需要3秒多,可以认为时间一样。
这就让我很不解了,如果vector的排序是std::sort做的,sort本身调用了swap做的快排处理,那么按照C++98/03编译,元素交换引起了一次拷贝,而按照C++11编译,元素交换是move(),没有需要重新分配和销毁一次字符串。

那么C++11版本的应该快很多才对。为什么我的测试结果是没有区别? 我的程序或者理解哪里出了问题吗?
还是说,GCC的std::string实现,在以前就做了某种内部的优化,以至于能到到类似C++11的move的效果?

谢谢。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2016-12-08 01:49 |显示全部楼层
std::swap对std::basic_string做了特化,这个特化在C++11出来之前就已经有了。

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2016-12-08 09:33 |显示全部楼层
回复 2# windoze

也就是说玩的还是pointer

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
发表于 2016-12-08 11:54 |显示全部楼层
回复 3# lxyscls

没错,至少C++03里面的swap就已经对string这么干了,所以C++11并不能提高速度。

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
发表于 2016-12-09 17:13 |显示全部楼层
windoze 发表于 2016-12-08 11:54
回复 3# lxyscls

没错,至少C++03里面的swap就已经对string这么干了,所以C++11并不能提高速度。

谢谢你的提醒。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP