Разрешение time_t
составляет максимум одну секунду на большинстве платформ. То есть на большинстве платформ time_t
будет целочисленным (32- или 64-разрядным) значением, подсчитывающим количество секунд, прошедших с полуночи 1 января 1970 года (UTC), и может достичь только одного второе разрешение.
Следовательно, сумма значений time_t
также будет отображать разрешение только в одну секунду (без десятичной части, даже после преобразования в double
.)
Выше было сказано, какой нативный вызов или вызов OpenMP вы используете для получения значений time_t
, которые вы пытаетесь накапливать?
Если используется собственный вызов * nix getrusage()
для заполнения структуры rusage
(при условии, что ваша платформа поддерживает ее) со временем пользователя / ядра или с использованием gettimeofday()
, чтобы получить время на стене, затем используйте оба поля tv_sec
и tv_usec
, равные struct timeval
, чтобы сгенерировать значение double
(обычно с разрешением в миллисекундах или лучше) и использовать его вместо time_t
в ваших расчетах:
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Соответственно, вы можете использовать GetThreadTimes
/ GetProcessTimes
для времени пользователя / ядра или _ftime
для настенного времени на платформах Windows, затем объединить FILETIME::dwHighDateTime/dwLowDateTime
.