С правильной ссылкой на значение и семантикой перемещения, скорость обмена/сортировки C++ 11 должна быть равна или больше, чем C++ 03. Поэтому я разработал простой эксперимент, чтобы проверить это.Моя тестовая версия C++ 11, что сортировка (вектор <string>) еще медленнее, чем 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 включен, программа работает медленнее. я на совершенно новом макинтош и ССАГПЗ среды:
$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;
}
Любая ошибка с моей программой или понимания, как объяснить мой результат теста?
На самом деле вам нужна ваша экспертиза!
Вместо рандомизированного набора ввода вы должны иметь фиксированный набор данных для сравнения скорости сортировки. –
Ваша функция randomString действительно странная и сломанная. – user2357112
... такой фиксированный набор данных, конечно, может быть сгенерирован с использованием 'random()', но семя должно быть исправлено, чтобы вы проводили справедливое сравнение. Можете ли вы попробовать это и [изменить] результат в вопросе? – Angew