2016-12-11 3 views
1

С правильной ссылкой на значение и семантикой перемещения, скорость обмена/сортировки 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; 
} 

Любая ошибка с моей программой или понимания, как объяснить мой результат теста?

На самом деле вам нужна ваша экспертиза!

+7

Вместо рандомизированного набора ввода вы должны иметь фиксированный набор данных для сравнения скорости сортировки. –

+4

Ваша функция randomString действительно странная и сломанная. – user2357112

+3

... такой фиксированный набор данных, конечно, может быть сгенерирован с использованием 'random()', но семя должно быть исправлено, чтобы вы проводили справедливое сравнение. Можете ли вы попробовать это и [изменить] результат в вопросе? – Angew

ответ

2

В вашем тестовом коде несколько вопросов.

  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 

Кстати, г ++ из Xcode на макинтош на самом деле лязг. Но результаты аналогичны:

$ 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 ++ компилируется в режиме, который дает быстрое время.

+0

g ++ 6 по умолчанию - '-std = gnu ++ 14'. –

+0

Кроме того, он должен выполнять несколько итераций сортировки с каждым исполнением и принимать среднее значение. –