Ответ 1
-
Correct
В соответствии со стандартом:
system_clock представляет [s] время настенных часов из общесистемных часов реального времени.
Библиотека
<chrono>
не предоставляет механизм для измерения времени процессора, поэтому, если вы хотите, чтобы вам пришлось вернуться к старой библиотеке<ctime>
и использоватьstd::clock()
.(И если вы ориентируетесь на Windows, вам придется отказаться от того, какой API-интерфейс, определенный платформой, обеспечивает получение процессорного времени, поскольку, как вы отмечаете, их
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";