Я новичок в C++, и я мало что знаю о его библиотеке. Мне нужно сделать анализ времени для разных алгоритмов сортировки, для чего мне нужно получить текущее время в миллисекундах. Есть ли способ сделать это?Как получить текущее время в миллисекундах?
ответ
Просто используйте 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;
}
Вместо печати звезд, вы будете размещать свой алгоритм сортировки там и время измерения.
Не забудьте включить флаги оптимизации для компилятора, если вы собираетесь сделать некоторые сравнения, например, для g++, вам нужно -O3
. Это серьезно, проверить, что случилось со мной, когда я не делал так: Why emplace_back is faster than push_back?
Ps: Если ваш компилятор не поддерживает c++11, то вы могли бы искать другие методы в моем 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
Спасибо gsamaras за решение. –
Вы можете упростить свой первый блок кода, назначив его в double-based-millisecond без явного приведения: 'duration
@HowardHinnant крутые советы в комментариях и видео! Спасибо. Я обновил свой ответ, надеюсь, вам понравится сейчас. =) – gsamaras
взгляд в станд :: chorno – DanielCollier
Для анализа алгоритмов сортировки, миллисекунды не может быть достаточно низким разрешением, и «текущее время» ISN» действительно, что вам нужно. Вы хотите относительное время, необходимое для выполнения задачи. 'std :: chrono :: high_resolution_clock', вероятно, то, что вы хотите. – Chad
Спасибо gsamaras за решение, просто небольшое сомнение, так как кто-то выше в комментариях сказал, что текущее время - относительное время, в java текущее время рассчитывается с полуночи 1sr января 1970 года, поэтому функция high_resolution_clock :: now() возвращает время относительно какое время? –