`clock ()` дает обычные часы вместо часов процессора - PullRequest
0 голосов
/ 16 января 2019

Я использовал clock(), чтобы получить процессорное время моих алгоритмов. Тем не менее, это, кажется, не работает больше. У меня есть виртуальная машина Windows 10 с 8 процессорами, что также видно на мониторе ресурсов.

Теперь я измеряю время следующим образом:

auto startTime = std::chrono::high_resolution_clock::now();
auto startClocks = std::clock();

// some code with TBB that uses multiple threads

auto endTime = std::chrono::high_resolution_clock::now();
auto endClocks = std::clock();
auto duration = endTime - startTime;
auto clockDuration = endClocks - startClocks;

auto durationSeconds = static_cast<double>(std::chrono::duration_cast<std::chrono::milliseconds>(duration).count()) / 1000.;
auto durationCpuSeconds = 1. * clockDuration / CLOCKS_PER_SEC;

Часть TBB, безусловно, работает, как я вижу в мониторе ресурсов Windows, что все процессоры работают со 100%. Если я начну бесконечный цикл без распараллеливания, загрузка процессора составит всего 12,5%, как и ожидалось.

Однако durationSeconds и durationCpuSeconds абсолютно одинаковы ...

Я измерил время своими часами, и в результате получилось время на стене. Таким образом, clock() явно не показывает процессорного времени, которое должно быть существенно выше, если 8 процессоров работают на 100% параллельно. clock() ненадежен или я что-то здесь упускаю?

1 Ответ

0 голосов
/ 16 января 2019

Да, он сломан в Windows.

Функция часов сообщает, сколько времени настенных часов прошло с момента инициализации CRT во время запуска процесса. Обратите внимание, что эта функция не строго соответствует ISO C, в котором в качестве возвращаемого значения указывается чистое время ЦП. Чтобы получить время процессора, используйте функцию Win32 GetProcessTimes .

(от Microsoft clock документы )

...