2016-12-10 4 views
7

Я новичок в C++, и я мало что знаю о его библиотеке. Мне нужно сделать анализ времени для разных алгоритмов сортировки, для чего мне нужно получить текущее время в миллисекундах. Есть ли способ сделать это?Как получить текущее время в миллисекундах?

+1

взгляд в станд :: chorno – DanielCollier

+0

Для анализа алгоритмов сортировки, миллисекунды не может быть достаточно низким разрешением, и «текущее время» ISN» действительно, что вам нужно. Вы хотите относительное время, необходимое для выполнения задачи. 'std :: chrono :: high_resolution_clock', вероятно, то, что вы хотите. – Chad

+0

Спасибо gsamaras за решение, просто небольшое сомнение, так как кто-то выше в комментариях сказал, что текущее время - относительное время, в java текущее время рассчитывается с полуночи 1sr января 1970 года, поэтому функция high_resolution_clock :: now() возвращает время относительно какое время? –

ответ

12

Просто используйте std::chrono. Общий пример ниже раз задание «печатания 1000 звезд»:

#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

int main() 
{ 
    using namespace std::chrono; 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 

    std::cout << "printing out 1000 stars...\n"; 
    for (int i=0; i<1000; ++i) std::cout << "*"; 
    std::cout << std::endl; 

    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double, std::milli> time_span = t2 - t1; 

    std::cout << "It took me " << time_span.count() << " milliseconds."; 
    std::cout << std::endl; 

    return 0; 
} 

Вместо печати звезд, вы будете размещать свой алгоритм сортировки там и время измерения.


Не забудьте включить флаги оптимизации для компилятора, если вы собираетесь сделать некоторые сравнения, например, для , вам нужно -O3. Это серьезно, проверить, что случилось со мной, когда я не делал так: Why emplace_back is faster than push_back?


Ps: Если ваш компилятор не поддерживает , то вы могли бы искать другие методы в моем Time Measurements (C++).


Специфический (игрушка) пример, используя мой Quicksort (C++), будет:

#include <iostream> 
#include <ctime> 
#include <ratio> 
#include <chrono> 

void quickSort(int a[], int first, int last); 
int pivot(int a[], int first, int last); 
void swap(int& a, int& b); 
void swapNoTemp(int& a, int& b); 

using namespace std; 
using namespace std::chrono; 

int main() 
{ 
    int test[] = { 7, -13, 1, 3, 10, 5, 2, 4 }; 
    int N = sizeof(test)/sizeof(int); 

    cout << "Size of test array :" << N << endl; 

    high_resolution_clock::time_point t1 = high_resolution_clock::now(); 

    // I want to measure quicksort 
    quickSort(test, 0, N-1); 

    high_resolution_clock::time_point t2 = high_resolution_clock::now(); 

    duration<double> time_span = t2 - t1; 

    std::cout << "It took me " << time_span.count() << " seconds."; 
    std::cout << std::endl; 

    return 0; 
} 

и выход сейчас:

Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall -std=c++11 -O3 main.cpp 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Size of test array :8 
It took me 3.58e-07 seconds. 

Это так просто. Счастливый бенчмаркинг! =)


РЕДАКТИРОВАТЬ:

high_resolution_clock::now() функция возвращает время, относительно которого времени?

От std::chrono:

Время указует

Ссылки на определенный момент времени, как свое день рождения, сегодняшнее утро, или когда проходит следующий поезд. В этой библиотеке объекты шаблона класса time_point выражают это с использованием продолжительности относительно эпохи (которая является фиксированной точкой во времени , общей для всех объектов time_point с использованием тех же часов).

, где можно было бы проверить это epoch and time_point example, который выводит:

time_point tp is: Thu Jan 01 01:00:01 1970 
+1

Спасибо gsamaras за решение. –

+2

Вы можете упростить свой первый блок кода, назначив его в double-based-millisecond без явного приведения: 'duration time_span = t2 - t1;'. И затем вы можете распечатать это без ручного преобразования в миллисекунды: '<< time_span.count() <<" миллисекунды. "'. Вы также можете удалить явный 'duration_cast' во втором примере. Другие советы для написания более надежного кода 'chrono' приведены здесь: https://www.youtube.com/watch?v=P32hvk8b13M –

+0

@HowardHinnant крутые советы в комментариях и видео! Спасибо. Я обновил свой ответ, надеюсь, вам понравится сейчас. =) – gsamaras