- 论坛徽章:
- 2
|
本帖最后由 cdsfiui 于 2016-12-07 23:00 编辑
C++11里面swap可以采取move()来避免拷贝,使得std::sort能否更快。
然后我做了一个实验来验证这个说法:
1. 我首先构造了一个vector,有10240000个元素,里面填入随机字符串(由randomString函数生成)。
2. 开始计时,用std::sort排序这个vector,结束计时。
- #include<string>
- #include<algorithm>
- #include<vector>
- #include<cstdlib>
- #include<cstdio>
- #include<iostream>
- #include<ctime>
- using namespace std;
- string randomString()
- {
- int iBuf[10];
- for(size_t i=0;i<10;++i)
- {
- double rand0to1=(double)rand()/RAND_MAX;
- iBuf[i]=rand0to1*92+33;
- }
- char ret[6];
- snprintf(ret, 6, "%c%c%c%c%c\n",
- iBuf[0],iBuf[1],iBuf[2],iBuf[3],iBuf[4]);
- 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;
复制代码
我采用两种方式编译和运行它
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的效果?
谢谢。
|
|