我正在寻找确定 NTP 时间戳向量的日期分量的最快方法。
在这种情况下,输入是自 1900 年 1 月 1 日以来测量的 NTP 时间戳或秒数,通过添加 2208988800 或减去如果采用其他方式,往返 unix 时间是微不足道的。我需要将时间戳分解为其他 API 的日期组件,这些 API 只接受日期作为其组件,特别是年、月和日。
使用time.h
( glibc
) 中的 ANSI C 方法,我可以轻松导出组件,但对于较大的向量来说太慢了。较小的向量可能包含 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;
}
是否有潜伏的算法可以帮助我更快地推导出计算?像 Zeller 的算法,但从秒到日期组件?
谢谢!