C ++: конвертировать chrono :: high_resolution_clock в time_t - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть следующий код, который отлично работает:

 auto my_time = std::chrono::system_clock::now();
 std::cout << "My Time is " << std::chrono::system_clock::to_time_t(my_time) << std::endl;

Однако, если я заменю system_clock на high_resolution_clock, как показано ниже:

auto my_time = std::chrono::high_resolution_clock::now();
std::cout << "My Time is " << std::chrono::high_resolution_clock::to_time_t(my_time) << std::endl;

Я получил следующую ошибку:

    no member named 'to_time_t' in 'std::__1::chrono::steady_clock'
    std::cout << "My Time is " << std::chrono::high_resolution_clock::to_time_t(my_time) << std::endl;
                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
1 error generated.

Есть идеи, как заставить high_resolution_clock работать здесь?(Я тестирую некоторые функции, поэтому хотел бы использовать high_resolution_clock вместо system_clock) Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Как правило, невозможно chrono::high_resolution_clock::time_point преобразовать в time_t.Это не только потому, что в нем отсутствует to_time_t функция-член.Это потому что:

Нет абсолютно никакой связи между временем time_t мер и временем high_resolution_clock::time_point мер.

Думай о high_resolution_clock как о секундомере,Вы можете использовать его для измерения времени, которое потребовалось для какого-либо события.Но вы не можете определить с ним время суток.

На моей платформе high_resolution_clock измеряет число nanoseconds с момента загрузки системы.Если вы не знаете, в какое время система загружалась, невозможно перевести high_resolution_clock во время дня.

time_t, с другой стороны, обычно измеряет время с 1970-01-01 00:00:00 UTC, и поэтому имеет отношение к времени суток.

0 голосов
/ 13 декабря 2018

В вашей системе high_resolution_clock имеет псевдоним steady_clock, что не требуется стандартом для реализации to_time_t.Возможно, что они несовместимы, например, если time_t - это секунды с начала эпохи, а high_resolution_clock::period меньше 1 секунды, то вы не можете представить high_resolution_clock::time_point как time_t без потери точности.

Если вы используете это для бенчмаркинга, вы, вероятно, можете вообще пропустить преобразование в time_t.Просто сделайте что-то вроде:

auto start = std::chrono::high_resolution_clock::now();
my_function();
auto end = std::chrono::high_resolution_clock::now();
std::cout << "my_function took " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;
...