c++ duration_cast - странное поведение
using namespace std::chrono;
time_point<steady_clock> time_start;
time_point<steady_clock> time_end;
time_point<steady_clock> time_extent;
long long result;
time_start = steady_clock::now();
// Измеряемый код
time_end = steady_clock::now();
time_extent = steady_clock::now() - time_start;
// Это работает:
result = duration_cast<microseconds>(steady_clock::now() - time_start).count();
result = duration_cast<microseconds>(time_end - time_start).count();
time_start = {};
result = duration_cast<microseconds>(time_extent - time_start).count();
result = duration_cast<microseconds>(time_extent - time_point<steady_clock>{}).count();
// А это выдаёт ошибку
result = duration_cast<microseconds>(time_extent).count();
Ошибка C2672 "duration_cast": не найдена соответствующая перегруженная функция
Пробовал компиляторы: Microsoft Visual Studio 2022, clang из llvm_project, clang из msys2, MinGW из msys2, MinGW отсюда. Везде эта странная ошибка.
Чего им всем не хватает?
Ответы (2 шт):
В комментарий не влезу...
Вот, примерно так. time_start
и time_end
— моменты времени, time_extent
— продолжительность.
time_point<steady_clock> time_start;
time_point<steady_clock> time_end;
long long result;
time_start = steady_clock::now();
time_end = steady_clock::now();
auto time_extent = steady_clock::now() - time_start;
result = duration_cast<microseconds>(steady_clock::now() - time_start).count();
result = duration_cast<microseconds>(time_end - time_start).count();
time_start = {};
//Nonsence
//result = duration_cast<microseconds>(time_extent - time_start).count();
//result = duration_cast<microseconds>(time_extent - time_point<steady_clock>{}).count();
result = duration_cast<microseconds>(time_extent).count();
Nonsence — бессмысленные инструкции: что значит, например, из промежутка в 5 часов вычесть 2 часа дня?...
Nonsence — бессмысленные инструкции: что значит, например, из промежутка в 5 часов вычесть 2 часа дня?...
Да согласен, что это сильно криво, поэтому и спросил почему у меня не получается просто использовать time_extent
в duration_cast
без этих извращений. А вычитается там ноль, чисто для того чтобы привести момент к промежутку и избежать ругани компилятора.
Поясню - хочу выяснить какую часть времени занимает участок кода внутри цикла относительно всего цикла, для этого мне нужно просуммировать несколько интервалов.
Получается идеологически правильно будет такой вариант?:
time_point<steady_clock> time_start_full;
time_point<steady_clock> time_start_partial;
duration<double> time_partial {};
time_start_full = steady_clock::now();
for (size_t i = 0; i < n; i++)
{
time_start_partial = steady_clock::now();
// часть кода в цикле
time_partial += steady_clock::now() - time_start_partial;
// остальной код в цикле
};
long long result_full = duration_cast<microseconds>(steady_clock::now() - time_start_full).count();
long long result_partial = duration_cast<microseconds>(time_partial).count();
вместо моего первоначального варианта:
time_point<steady_clock> time_partial {};
...
time_partial += steady_clock::now() - time_start_partial;
который внутри цикла тоже работает, но потом спотыкается на duration_cast
.