Я ищу самый быстрый способ определить компоненты даты для вектора временных меток NTP.
Входными данными в этом случае являются временные метки NTP или секунды, измеренные с 1900-01-01, переход к времени unix и обратно тривиален, добавляя 2208988800 или вычитая, если идти другим путем. Мне нужно разбить временные метки на компоненты даты для других API, которые принимают только даты в качестве своих компонентов, а именно год, месяц и день.
Используя методы ANSI C из time.h
(glibc
), я могу легко получить компоненты, но это слишком медленно для больших векторов. Меньший вектор может содержать 172800 значений, но более реалистично я хотел бы иметь возможность как можно быстрее обрабатывать вектор с 1314000 значениями.
Я думал, что мог бы сам сократить время и устранить небольшое количество накладных расходов glibc
, итеративно вычитая входную отметку времени секундными делителями для каждого компонента даты, пока я не достигну даты, по сути, то, что делает glibc
, но без часовых поясов и некоторых дополнительных ( маленький) накладной.
Я быстро обнаружил, что это все еще медленно, чтобы идти об этом таким образом.
Я работаю с чем-то вроде этого:
typedef struct simple_time_ {
int year;
int month;
int day;
} simple_time;
size_t time_cruncher(const time_t *ntp_vector, simple_time *out, size_t len)
{
size_t i;
time_t corrected;
struct tm cal;
for(i=0;i<len;i++) {
corrected = ntp_vector[i] - 2208988800; /* NTP Offset */
gmtime_r(&corrected, &cal);
simple_time[i].year = cal.tm_year + 1900;
simple_time[i].month = cal.tm_mon + 1;
simple_time[i].day = cal.tm_mday;
}
return i;
}
Есть ли скрывающийся алгоритм, который может помочь мне быстрее произвести вычисления? Что-то вроде алгоритма Целлера, но переход от секунд к дате компонентов?
Спасибо!
gmtime_r
уже настолько быстр, насколько это возможно, оставаясь при этом безошибочным. - person Taylor Brandstetter   schedule 28.06.2013