大字符串排序,std::sort(vector)发现C++11比03更慢了,为何?

iduafier 2016-12-11 04:11:10
有了右值语义和移动, C++11的排序/交换的速度,应该等于或者大于C++03对吧,为此做了一个简单的实验,构造大字符串容器,然后排序。

分别用C++03标准和C++11标准编译和运行,打开O2优化:

$g++ test.cpp -O2 && ./a.out
10240000结束构造
sort 10240000个元素耗时1.40035秒

$g++ test.cpp -O2 -std=c++11 && ./a.out
10240000结束构造
sort 10240000个元素耗时2.25684秒

看起来用了C++11反而慢了,这是为何? 我在mac上面,很新的环境

$gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 7.3.0 (clang-703.0.31)
Target: x86_64-apple-darwin15.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

下面是源代码。

#include<string>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cstdio>
#include<iostream>
#include<ctime>
using namespace std;
string randomString()
{
const size_t scale=600;
char ret[scale];
for(size_t i=0;i<scale;++i)
{
double rand0to1=(double)rand()/RAND_MAX;
ret[i]=(char)rand0to1*92+33;
}
return ret;
}
int main()
{
srand(time(NULL));
const size_t scale=10240000;
vector<string> vs;
vs.reserve(scale);
for(size_t i=0;i<scale;++i)
{
vs.push_back(randomString());
}
cout<<vs.size()<<"结束构造\n";
clock_t begin=clock();
sort(vs.begin(),vs.end());
clock_t end=clock();
double duration=(double)(end-begin)/CLOCKS_PER_SEC;
cout<<"sort "<<scale<<"个元素耗时"<<duration<<"秒\n";
return 0;
}

还请各位大侠给个解释啊,迷惑中!
...全文
362 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
sort的时候用的swap,没有用到右值优化的地方啊。
ri_aje 2016-12-12
  • 打赏
  • 举报
回复
同样的问题,楼主不是已经在这里(http://bbs.csdn.net/topics/392060392)问了吗?
xskxzr 2016-12-11
  • 打赏
  • 举报
回复
既然是随机数据,两次不同的运行时间有差别不是很正常吗……

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧