У меня есть несколько вопросов о новых <chrono>
заголовок в C ++ 11. Использование Windows 7, Visual Studio 2012.
Глядя на пример http://en.cppreference.com/w/cpp/chrono
#include <iostream>
#include <chrono>
#include <ctime>
int fibonacci(int n)
{
if (n < 3) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
int main()
{
std::chrono::time_point<std::chrono::system_clock> start, end;
start = std::chrono::system_clock::now();
int result = fibonacci(42);
end = std::chrono::system_clock::now();
int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
(end-start).count();
std::time_t end_time = std::chrono::system_clock::to_time_t(end);
std::cout << "finished computation at " << std::ctime(&end_time)
<< "elapsed time: " << elapsed_seconds << "s\n";
}
Возможный вывод
finished computation at Sat Jun 16 20:42:57 2012
elapsed time: 3s
std::chrono::system_clock::now();
это означает, что это может использоваться, чтобы измерить только истекшее время, а не процессорное время ??? И если я хочу измерить процессорное время, какие часы мне использовать? elapsed time: 3s
вывод округляется до целого числа. Есть ли способ сделать его более гранулированным?Правильный
Согласно стандарту:
system_clock представляет [s] время настенных часов из общесистемных часов реального времени.
<chrono>
Библиотека не предоставляет механизм измерения времени процессора, поэтому, если вы хотите, вам придется вернуться к старому <ctime>
библиотека и использование std::clock()
,
(И если вы ориентируетесь на Windows, вам придется прибегнуть к любому API для конкретной платформы, который Windows предоставляет для получения процессорного времени, поскольку, как вы указали, их std::clock()
не работает правильно.)
system_clock
больше похоже на коллегу std::time()
чем std::clock()
, (Например, обратите внимание, что system_clock
обеспечивает преобразования между system_clock::time_point
с и time_t
.) Я представляю, что отсутствие часов в <chrono>
Измерение времени процессора связано с ограничениями по времени для комитета по стандартизации и тем фактом, что эта функциональность используется меньше, чем настенные часы системы и часы реального времени.
Если вы хотите процессорное время, но также хотите преимущества, которые <chrono>
предусматривает, что вы должны реализовать тип часов, который соответствует концепции часов, изложенной в стандарте, и который обеспечивает процессорное время, возможно, реализованное внутренне с использованием std::clock()
,
Строка, которая говорит
int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds> (end-start).count();
это то, что заставляет время округляться до целого числа секунд. Вы можете выбрать любой период, который хотите, или использовать представление с плавающей запятой, чтобы разрешить нецелые значения:
std::int64_t elapsed_attoseconds =
std::chrono::duration_cast<std::chrono::duration<std::int64_t, std::atto>>
(end-start).count();
double elapsed_seconds =
std::chrono::duration_cast<std::chrono::duration<double,std::ratio<1>>>
(end-start).count();
Обратите внимание, что в реальном коде вы должны избегать использования .count()
чтобы избежать сильной типизации, предоставляемой chrono::duration
пока вы абсолютно не должны.
auto total_duration = end - start;
auto seconds = std::chrono::duration_cast<std::chrono::seconds>(total_duration);
auto milli = std::chrono::duration_cast<std::chrono::milliseconds>(total_duration - seconds);
std::cout << seconds.count() << "s " << milli.count() << "ms\n";
1) Я уверен, что самое высокое разрешение, которое вы можете получить, это использовать std::chrono::high_resolution_clock
и тогда не делайте никакого продолжительного чтения:
int elapsed_ticks = (end-start).count();
2) Измените аргумент duration_cast на что-то вроде nanoseconds
:
int elapsed_seconds = std::chrono::duration_cast<std::chrono::nanoseconds>
(end-start).count();