2014-05-28 4 views
0

Мне нужно измерить несколько раз (миллисекунды) моего приложения на некоторые итерации. Для этого я хочу использовать std :: chrono-Library. Теперь я хочу создать вектор миллисекунд, поэтому я могу сохранить все мои измеренные времена в этом векторе. После этого я хотел бы отсортировать вектор для получения медианы.Вектор std :: chrono :: миллисекунды

Но iam в настоящее время не может создать вектор. Я не знаю, какой тип я должен предпринять, чтобы создать его. Кто-нибудь знает, как это может работать? Я не мог найти ответы на мои вопросы.

Это то, что я пытался до сих пор:

vector<chrono::milliseconds> times; 

for(int z = 0; z < 10; z++){ 
     auto start = chrono::high_resolution_clock::now(); 
     //... the application to measure 
     auto end = chrono::high_resolution_clock::now(); 
     auto elapsedtime = chrono::duration_cast<chrono::milliseconds>(end - start).count(); 
     times.push_back(elapsedtime); 
} 

std::sort(times.begin(), times.end()); 

std::cout << "Median: " << times.at(times.size()/2) << "(ms)" << endl; 
+3

В чем проблема вы столкнулись? Ошибки компиляции? Вам нужно предоставить дополнительную информацию. – Theolodis

+0

Смените ваш вектор на std :: vector раз, и со мной все будет в порядке. – 101010

ответ

3

Ваш вектор правильный тип для хранения std::chrono::duration. Ошибки при создании вектора не должно быть.

Существует, однако, ошибка, при которой вы пытаетесь заполнить вектор здесь:

auto elapsedtime = chrono::duration_cast<chrono::milliseconds>(end - start).count(); 
times.push_back(elapsedtime); 

Вы можете установить время, прошедшее до значения, возвращаемого std::duration::count, который возвращает внутреннюю tickcount длительности. Это тип std::duration::rep. Просто удалите счет, и он должен работать.

+0

Большое спасибо. Это решило мою проблему! – user3531686

+1

@ user3531686 вообще '.count()' следует избегать, а 'duration_cast', как и все броски, следует рассматривать с подозрением. В этом случае литье, вероятно, хорошо, хотя может быть лучше изменить тип вектора, чтобы преобразование не было необходимым: 'vector times;', а затем 'times.push_back (end-start); '. – bames53

1

Ваша проблема в том, что elapsedtime не chrono::milliseconds, но chrono::milliseconds::rep. Вы можете сделать это:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <chrono> 

int main() { 
    using namespace std; 
    vector<chrono::milliseconds> times; 

    for(int z = 0; z < 10; z++) { 
    auto start = chrono::high_resolution_clock::now(); 
    //... the application to measure 
    auto end = chrono::high_resolution_clock::now(); 
    auto elapsedtime = chrono::duration_cast<chrono::milliseconds>(end - start).count(); 
    times.push_back(chrono::milliseconds(elapsedtime)); 
    } 

    std::sort(times.begin(), times.end()); 

    std::cout << "Median: " << times.at(times.size()/2).count() << "(ms)" << endl; 
} 

Или это:

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <chrono> 

int main() { 
    using namespace std; 
    vector<chrono::milliseconds::rep> times; 

    for(int z = 0; z < 10; z++) { 
    auto start = chrono::high_resolution_clock::now(); 
    //... the application to measure 
    auto end = chrono::high_resolution_clock::now(); 
    auto elapsedtime = chrono::duration_cast<chrono::milliseconds>(end - start).count(); 
    times.push_back(elapsedtime); 
    } 

    std::sort(times.begin(), times.end()); 

    std::cout << "Median: " << times.at(times.size()/2) << "(ms)" << endl; 
} 

Или даже

#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <chrono> 

int main() { 
    using namespace std; 
    vector<chrono::milliseconds> times; 

    for(int z = 0; z < 10; z++) { 
    auto start = chrono::high_resolution_clock::now(); 
    //... the application to measure 
    auto end = chrono::high_resolution_clock::now(); 
    auto elapsedtime = chrono::duration_cast<chrono::milliseconds>(end - start); 
    times.push_back(elapsedtime); 
    } 

    std::sort(times.begin(), times.end()); 

    std::cout << "Median: " << times.at(times.size()/2).count() << "(ms)" << endl; 
} 

(live at coliru)

+0

Также спасибо за быстрый ответ! Я знаю, что использую последний вариант, и он отлично работает. – user3531686

+1

Или: 'vector times;' и 'times.push_back (end-start);'. Я бы настоятельно рекомендовал использовать 'vector '. Первый вариант опасно избыточен и создает возможность для этой ошибки: 'times.push_back (chrono :: microseconds (elapsedtime));', однако я бы предпочел это по второму варианту. – bames53