NTP タイムスタンプのベクトルの日付コンポーネントを決定する最速の方法を探しています。
この場合の入力は、1900-01-01 以降に測定された NTP タイムスタンプまたは秒です。UNIX 時間とのやり取りは、2208988800 を加算するか、逆の場合は減算することで簡単です。特に年、月、日のコンポーネントとして日付のみを受け入れる他の API では、タイムスタンプを日付コンポーネントに分解する必要があります。
time.h
( )から ANSI C メソッドを使用glibc
すると、コンポーネントを簡単に導出できますが、大きなベクトルには遅すぎます。小さいベクトルには 172800 の値が含まれる場合がありますが、より現実的には、1314000 の値を持つベクトルをできるだけ早く処理できるようにしたいと考えています。
glibc
日付に到達するまで、各日付コンポーネントの2番目の約数でタイムスタンプ入力を繰り返し減算することで、自分で時間を処理し、少量のオーバーヘッドを排除できると考えてい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 のアルゴリズムのようなものですが、秒から日付のコンポーネントに移行しますか?
ありがとう!