std :: chrono and cout - PullRequest
       39

std :: chrono and cout

30 голосов
/ 25 октября 2011

У меня глупая проблема. Я пытаюсь переключиться на заголовки c ++ 11, и одним из них является chrono. Но моя проблема в том, что я не могу оценить результат временных операций. Например:

auto t=std::chrono::high_resolution_clock::now();
cout<<t.time_since_epoch();

дает:

инициализация аргумента 1 из ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’ ... /usr/include/c++/4.6/ostream

cout<<(uint64_t)t.time_since_epoch();

дает неверное приведение

Ответы [ 4 ]

36 голосов
/ 25 октября 2011

Как уже отмечали другие, вы можете вызвать функцию-член count(), чтобы получить внутренний счетчик.

Я хотел добавить, что я пытаюсь добавить новый заголовок: <chrono_io> в эту библиотеку. Это задокументировано здесь . Основное преимущество <chrono_io> перед использованием count() заключается в том, что единицы времени компиляции распечатываются для вас. Эту информацию, конечно, можно получить вручную, но гораздо проще иметь библиотеку для нее.

Для меня ваш пример:

#include <iostream>
#include <chrono_io>

int main()
{
    auto t = std::chrono::high_resolution_clock::now();
    std::cout << t.time_since_epoch() << '\n';
}

Выходы:

147901305796958 nanoseconds

Исходный код для этого является открытым исходным кодом и доступен по ссылке выше. Он состоит из двух заголовков: <ratio_io> и <chrono_io> и 1 источника: chrono_io.cpp.

Этот код следует считать экспериментальным. Это не стандарт, и почти наверняка не будет стандартизировано как есть. Действительно, предварительные комментарии от LWG указывают, что они предпочли бы, чтобы вывод по умолчанию был тем, что это программное обеспечение называет «краткой формой». Этот альтернативный вывод может быть получен с помощью:

std::cout << std::chrono::duration_fmt(std::chrono::symbol)
          << t.time_since_epoch() << '\n';

И выходы:

147901305796958 ns
22 голосов
/ 25 октября 2011

Быстрый поиск в Google нашел эту страницу: http://en.cppreference.com/w/cpp/chrono/duration,, где вы можете найти пример печати продолжительности.

Редактировать: он был перемещен в http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

9 голосов
/ 20 мая 2015

Если вы хотите синхронизацию с разрешением в миллисекундах, вот как вы можете это сделать:

auto t1 = std::chrono::high_resolution_clock::now();
//process to be timed
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "process took: "
    << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
    << " milliseconds\n";

Не забудьте добавить среди включенных заголовков:

#include <chrono> //timing
7 голосов
/ 25 октября 2011

Не уверен, что вы ожидаете от этого состава, может быть, вы хотели t.time_since_epoch().count()?

...