stl — несколько вопросов о & lt; chrono & gt; заголовок в C ++ 11

У меня есть несколько вопросов о новых <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
  1. Я заметил, что пример использует std::chrono::system_clock::now(); это означает, что это может использоваться, чтобы измерить только истекшее время, а не процессорное время ??? И если я хочу измерить процессорное время, какие часы мне использовать?
  2. Заметить, что elapsed time: 3s вывод округляется до целого числа. Есть ли способ сделать его более гранулированным?

10

Решение

  1. Правильный

    Согласно стандарту:

    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(),

  2. Строка, которая говорит

    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";
    
15

Другие решения

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();
4

По вопросам рекламы [email protected]