gpt4 book ai didi

c++ - 我的 C++11 测试表明 sort(vector) 比 C++03 还要慢,有什么错误吗?

转载 作者:行者123 更新时间:2023-11-30 03:35:42 26 4
gpt4 key购买 nike

有了正确的值引用和 move 语义,C++11 的交换/排序速度应该等于或大于 C++03。所以我设计了一个简单的实验来测试这一点。

我用-O2编译和运行它,标准是c++03和c++11。

$g++ test.cpp -O2 && ./a.out
10240000 end construction
sort 10240000 spent1.40035

$g++ test.cpp -O2 -std=c++11 && ./a.out
10240000 end construction
sort 10240000 spent2.25684

所以看起来启用了 C++11,程序变慢了。我在一个非常新的 mac 和 gcc 环境中:

$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()<<" end 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<<" spent"<<duration<<"\n";
return 0;
}

我的程序或理解有什么错误,如何解释我的测试结果?

真的需要你的专业知识!

最佳答案

您的测试代码有几个问题。

  1. 您在 ret 中生成的字符串不是空终止的,因此它将包含来自堆栈的垃圾,这可能会随着编译器设置而改变。这是导致您出现奇怪结果的最可能原因:c++11 版本对较长的字符串进行排序。

  2. 您的转换会生成完全相同的字符串。这不是测量的实际问题,但可能不是您对测试感兴趣的问题。

  3. 您不应使用真正随机的种子进行基准测试。您希望在每次运行时生成相同的字符串以获得可重复性。

此固定版本的代码:

#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);
}
ret[scale-1] = 0;
return ret;
}
int main()
{
srand(1);
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 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<<" spent "<<duration<<"\n";
return 0;
}

产生我相信你所期待的:

$ g++ -O2 -std=c++03 test.cpp && ./a.out
10240000 end construction
sort 10240000 spent 10.8765

$ g++ -O2 -std=c++11 test.cpp && ./a.out
10240000 end construction
sort 10240000 spent 8.72834

顺便说一句,Mac 上 Xcode 的 g++ 实际上是 clang。但结果是相似的:

$ clang++ -O2 -std=c++03 test.cpp && ./a.out
10240000 end construction
sort 10240000 spent 10.9408

$ clang++ -O2 -std=c++11 test.cpp && ./a.out
10240000 end construction
sort 10240000 spent 8.33261

使用 g++ 6.2.1 和 clang 3.9.0 测试。 -std=c++03 开关很重要,因为没有它,g++ 会以提供快速时间的模式编译。

关于c++ - 我的 C++11 测试表明 sort(vector<string>) 比 C++03 还要慢,有什么错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41084230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com