Портативный хорошая точность двойной отметки времени в C ++? - PullRequest
3 голосов
/ 27 февраля 2012

Вот что мне нужно сделать:

double now=getdoubletimestampsomehow();

Где getdoubletimestampsomehow () должна быть простой, простой в использовании функцией, возвращающей двойное значение, представляющее количество секунд, прошедших с данной даты,Мне нужно, чтобы оно было достаточно точным, но мне не нужно, чтобы оно было более точным, чем несколько миллисекунд.Переносимость очень важна, если вы не можете напрямую ее портировать куда-либо, не могли бы вы сказать мне, как это сделать в Unix и Windows?

Ответы [ 4 ]

4 голосов
/ 27 февраля 2012

Вы смотрели на Boost и особенно на Date_Time library ? Вот пример секунд с начала эпохи .

Вам будет сложно найти что-то более портативное и с более высоким разрешением.

2 голосов
/ 22 августа 2013

C ++ 11 представил заголовок <chrono>, содержащий довольно много переносимых часов.Часы с самым высоким разрешением среди них - std::chrono::high_resolution_clock.

. Текущее время отображается как объект std::chrono::time_point, имеющий элемент time_since_epoch.Это может содержать то, что вы хотите.

Ссылка :

До выпуска стандарта C ++ 11 не было никакого стандартного способа, которыммог точно измерить время выполнения куска кода.Программист был вынужден использовать внешние библиотеки, такие как Boost, или подпрограммы, предоставляемые каждой операционной системой.

Хроно-файл C ++ 11 предоставляет три стандартных тактовых сигнала, которые можно использовать для синхронизации своего кода:

  • system_clock - это часы реального времени, используемые системой;
  • high_resolution_clock - это часы с наименьшим возможным периодом тактов в текущей системе;
  • стационарный_клок -это монотонные часы, которые гарантированно никогда не будут отрегулированы.

Если вы хотите измерить время, затрачиваемое определенным фрагментом кода на выполнение, вы должны в общем случае использовать моно-монотонный устойчивый_клокчасы, которые никогда не настраиваются системой.Два других тактовых импульса, предоставляемых заголовком хронографа, могут время от времени регулироваться, поэтому разница между двумя последовательными моментами времени, t0

2 голосов
/ 27 февраля 2012

Переносимая двойная временная метка с хорошей точностью в C ++?

Не существует портативного способа получения высокоточной временной метки (миллисекунды) без использования сторонних библиотек.Максимальная точность, которую вы получите, составляет 1 секунду, используя time / localtime / gmtime.

Если вы хорошо работаете со сторонними библиотеками, используйте Boost или Qt 4.

как для Unix, так и для Windows, как это сделать?

GetSystemTime в Windows и gettimeofday в Linux.

Обратите внимание, что если выЕсли вы планируете использовать временные метки для определения порядка некоторых событий, это может быть плохой идеей.Системные часы могут иметь очень ограниченную точность (10 миллисекунд на платформе Windows), и в этом случае несколько выполненных операций могут привести к одной и той же отметке времени.Таким образом, для определения порядка событий вам понадобятся «логические метки времени» («векторные часы» - один из примеров).

На платформе Windows существуют высокоточные функции, которые можно использоватьопределить, сколько времени прошло с некоторой точки в прошлом (QueryPerformanceCounter), но они не связаны с временными метками.

0 голосов
/ 27 февраля 2012

Двойные значения не точны - поэтому ваша идея для double now=getdoubletimestampsomehow(); падает при первом препятствии.

Другие упоминали о других возможностях. Я бы изучил их.

...