2016-01-04 5 views
-3

Во время выполнения, заданного числом N (без знака long int), я должен принимать 2 * N входных данных от пользователя. Я должен их хранить. Задача выполнена, и вопрос заключается не в том, как это сделать. Я экспериментировал с кодом и как сделать его более стандартным и эффективным. Таким образом, существуют следующие три варианта среди других:vector <std::pair> Vs. 2 X vector <T>

  1. Построить два std::vector<unsigned long int> векторов, хранить первый и второй элемент соответственно каждой пары.
  2. Construct one std::vector<unsigned long int> вектор длины 2 * N.

  3. Построить один std::vector<std::pair<unsigned long int, unsigned long int> >.

Итак, я написал эту небольшую программу, чтобы увидеть скорость выполнения.

#include<iostream> 
#include<vector> 
#include<utility> 
#include<ctime> 
using namespace std; 
int main(int argc, char* argv[]){ 
    const unsigned long int len{10^10}; 
    clock_t time1{clock()}; 
    for(auto i = 1;i<100000;++i) 
    vector<unsigned long int>veca(2*len); 
    // vector<unsigned long int>vecb(len);                           
    cout<<((double)(clock()-time1)/CLOCKS_PER_SEC)/(100000)<<endl; 
    time1 = clock(); 
    typedef pair<unsigned long int, unsigned long int> NumberPair; 
    for(auto i = 1; i<100000;++i) 
    vector<NumberPair>vecu(len); 
    cout<<((double)(clock()-time1)/CLOCKS_PER_SEC)/(100000)<<endl; 
    return 1; 
} 

Выход был

  • 2.3658e-07
  • 3.1432e-07

Если вместо 10, длина 10^10 используется, то, то выход

  • 1.6742e-07
  • 8.591e-08

Таким образом, лучше пойти на выбор 3, чем выбор 2.

Аналогичным путем изменения кода, можно показать, что выбор 3 лучше, чем выбор 1.

Infact, эксперименты показывают, что выбор 3 лучше выбора 2, который лучше выбора 1

Кроме того, изменение времени выполнения меньше для небольших размеров данных и больше для больших размеров данных.

Какое объяснение такого поведения?

+1

Объяснение заключается в том, что вы выполняли плохую маркировку. Чтобы получить какой-либо значимый результат, запустите тот же код в цикле и время. Затем вы можете разделить общее время на номер повторения, чтобы получить среднее время. Это должно устранить временные издержки, так или иначе – StoryTeller

+0

@StoryTeller Я обновил код для среднего времени. Результаты согласуются. –

+6

'10^10' равно нулю. – aschepler

ответ

0

Трудно оценить относительные характеристики различных подходов с небольшим значением N. Следовательно, я бы не придавал большого веса первому набору чисел.

Второй набор цифр указывает на тренд.

Когда вы строите вектор типа

std::vector<std::pair<unsigned long int, unsigned long int> > 

число элементов составляет половину вектора, построенного с типом

std::vector<unsigned long int> 

Я собираюсь предположить, что разница в производительности вызванный тем фактом, что он принимает 2*N итераций на элементах вектора, чтобы заполнить данные во втором случае, в то время как половина элементов итераций на элементах вектора заполняет данные в первом случае.

Смежные вопросы