2

NTP タイムスタンプのベクトルの日付コンポーネントを決定する最速の方法を探しています。

この場合の入力は、1900-01-01 以降に測定された NTP タイムスタンプまたは秒です。UNIX 時間とのやり取りは、2208988800 を加算するか、逆の場合は減算することで簡単です。特に年、月、日のコンポーネントとして日付のみを受け入れる他の A​​PI では、タイムスタンプを日付コンポーネントに分解する必要があります。

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 のアルゴリズムのようなものですが、秒から日付のコンポーネントに移行しますか?

ありがとう!

4

2 に答える 2

1

連続するタイムスタンプの多くが同じ月にある可能性が高いことを考えると、それを有利に利用してください。

Pseudo code
1) Calculate the y,m,d for the given timestamp 't' as you have above.
2) now calculate the t0 = gmtime(y, m, 1) and t1 = gmtime(y, m+1, 1).  (Dec + 1 is OK)
3) As long as your timestamps are t0 <= t < t1, a simple add/divide is need to determine the day of the month.
4) Should 't' fall outside the range,  go to step 1.

また、当日の開始時刻と終了時刻を決定し、それが次のタイムスタンプに適用されるかどうかを確認することもできます。

于 2013-06-27T21:26:14.990 に答える