C ++ 11 или новее: наиболее лаконичная идиома для синхронизации с высоким разрешением? - PullRequest
0 голосов
/ 02 апреля 2020

Моя цель - получить количество секунд в double, содержащее количество времени, затрачиваемое некоторыми функциями.

Следующий код работает, но многословность периодов времени абсурдна.

Во-первых, я бы предположил, что длительность <> будет в единицах «1», но поскольку now() в ratio<1,1000000000> длительность тоже, я прав?

У меня проблема понимание того, почему ratio не имеет, например, оператора неявного преобразования в double; если я просто использую chrono::high_resolution_clock::period сам по себе в числовом контексте, я удивляюсь, почему он просто не делит для меня деление?

auto timepointBegin = chrono::high_resolution_clock::now();

// do something worth timing

auto timepointEnd  = chrono::high_resolution_clock::now();

chrono::duration<double> dur = timepointEnd - timepointBegin;

printf( "Total test time: %f sec", dur.count() *
          chrono::high_resolution_clock::period::num /
          chrono::high_resolution_clock::period::den );

Я читал, что std::chrono::seconds в основном typedef duration <long,ratio<1,1>>, но я использую это для замены типа dur ниже выдается ошибка tstopMT.cxx:67:38: error: conversion from 'duration<[...],ratio<[...],1000000000>>' to non-scalar type 'duration<[...],ratio<[...],1>>' requested . Может быть, мои глаза подводят меня, но они похожи на конвертируемые типы? Кроме того, я думаю, что это было бы катастрофой, так как он хранит секунды в int, верно?

Так что я попытался сделать тип chrono::duration<double,ratio<1,1>> вместо этого, но тоже не радость; это не учитывает тот факт, что now () возвращает наносекунды. Почему нет?

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Звучит так, будто вы ищете длительность на основе double с теми же единицами измерения, что и high_resolution_clock (в вашем случае наносекунды). Если это правильно, вот как вы можете это сделать:

chrono::duration<double, nano> dur = timepointEnd - timepointBegin;

или:

chrono::duration<double, chrono::high_resolution_clock::period> dur = 
    timepointEnd - timepointBegin;

Вот видеоурок по <chrono>, который я рекомендую. Это будет стоить вам час.

0 голосов
/ 03 апреля 2020

Оказывается, код длительности в порядке. Проблема заключалась в том, что я фактически не устанавливал время начала, поэтому он рассчитывал количество секунд с начала эпохи: в настоящее время 1585905624.

Я знал (или предположил, или это казалось правдоподобным, я забыл), что high_resolution_clock вернет наносекунды. Поэтому казалось разумным, что timepointEnd - timepointBegin вернет наносекунды.

Я думал, что вся эта сложность с ratio автоматически преобразует эти наносекунды в секунды для меня, когда я назначу разницу во времени в переменную chrono::duration<double> dur. Тем не менее, когда я печатал dur, он, похоже, содержал правдоподобное количество наносекунд: 1585905624 для моей задачи, которая казалась примерно 1,5 секунд или около того!

Распечатка различных значений в отладчике прояснила проблему , Сначала я с удивлением увидел, что timepointEnd - timepointBegin был 1 000 000 000 раз больше, чем dur. Хм, кажется, что преобразование делается ??? Я все еще был слишком глуп, чтобы подобрать эту подсказку, поэтому я распечатал timestampBegin, чтобы посмотреть, содержит ли он какое-то представление о наносекундах или о чем. И bin go: 0.

Сначала я не использовал отладчик, потому что "было очевидно", что источником моего плохого результата было то, что я не понимал, как использовать duration Не то чтобы я даже не рассчитал свою проблему.

...