为什么 C++11 std::sort() 在排序 std::string 时并不快?
Why C++11 std::sort() is not faster when sorting std::string?
std::sort() 使用 swap() 交换元素,C++11 中的 swap 现在在 swap() 中使用“move()”语义来避免复制。
我认为这对 std::string 特别有用。所以我设计了一个实验来验证这一点:
I constructed a vector of 10240000 elements(std::string), these elements are constructed by randomString() function.
Use std::sort to sort out all elements, and print out time duration.
#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()<<"End vector construction\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<<"Time elapse="<<duration<<"seconds\n";
return 0;
}
where swap now in C++11 uses "move()" semantics in swap() to avoid copy.
这就是 non-specialized/non-overloaded swap() 现在所做的。自从 C++11 之前就存在重载 std::swap(std::basic_string)
并且它从来不需要复制任何一个参数字符串的内存缓冲区。
I think this is especially useful for std::string
由于我在上一段中所说的,std::string
特别是移动语义对交换没有任何优势的情况。
基于通用移动的交换对于许多用例来说可能已经足够好了,它允许对自定义可移动类型进行高效交换,而无需您专门研究交换。但是专门的交换仍然可以(可能只是略微)更有效。
Why C++11 std::sort() is not faster when sorting std::string?
因为基于通用移动的交换与已经存在的专门交换相比没有优势。
std::sort() 使用 swap() 交换元素,C++11 中的 swap 现在在 swap() 中使用“move()”语义来避免复制。
我认为这对 std::string 特别有用。所以我设计了一个实验来验证这一点:
I constructed a vector of 10240000 elements(std::string), these elements are constructed by randomString() function.
Use std::sort to sort out all elements, and print out time duration.
#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()<<"End vector construction\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<<"Time elapse="<<duration<<"seconds\n";
return 0;
}
where swap now in C++11 uses "move()" semantics in swap() to avoid copy.
这就是 non-specialized/non-overloaded swap() 现在所做的。自从 C++11 之前就存在重载 std::swap(std::basic_string)
并且它从来不需要复制任何一个参数字符串的内存缓冲区。
I think this is especially useful for std::string
由于我在上一段中所说的,std::string
特别是移动语义对交换没有任何优势的情况。
基于通用移动的交换对于许多用例来说可能已经足够好了,它允许对自定义可移动类型进行高效交换,而无需您专门研究交换。但是专门的交换仍然可以(可能只是略微)更有效。
Why C++11 std::sort() is not faster when sorting std::string?
因为基于通用移动的交换与已经存在的专门交换相比没有优势。