次のように、ハードコードされた日付と時刻から静的な Unix 時刻を計算する C マクロを誰かが知っている/持っているかどうか疑問に思っています。
time_t t = UNIX_TIMESTAMP(2012, 5, 10, 9, 26, 13);
数値の静的タイムスタンプが必要なので、それを調べています。これはソフトウェア全体で何百回も実行され、毎回異なる日付で実行されます。毎秒何百回も実行されるため、高速であることを確認したいと考えています。何度も日付を変換すると、確実に速度が低下します (つまり、mktime() を呼び出すと、静的な数値をコンパイルするよりも遅くなりますよね?)
[2012 年 11 月 23 日、この段落をより明確にするために更新を行いました]
アップデート
使用されているプロセスに関する詳細情報を使用して、質問を明確にしたいと思います。サーバーがリクエストを受け取ると、リクエストごとに新しいプロセスが開始されます。そのプロセスは常に新しいプラグインで更新され、そのような更新にはデータベースの更新が必要になることがよくあります。これらは一度だけ実行する必要があります。更新が必要かどうかを知るために、Unix の日付を使用したいと考えています (カウンターは時々壊れる可能性が高いため、カウンターを使用するよりも優れています)。
したがって、プラグインは更新シグナルを受信し、on_update() 関数が呼び出されます。そこで私は次のようなことをしたい:
void some_plugin::on_update(time_t last_update)
{
  if(last_update < UNIX_TIMESTAMP(2010, 3, 22, 20, 9, 26)) {
    ...run update...
  }
  if(last_update < UNIX_TIMESTAMP(2012, 5, 10, 9, 26, 13)) {
    ...run update...
  }
  // as many test as required...
}
ご覧のとおり、毎回 UNIX タイムスタンプを計算する必要がある場合、これはプロセスごとに数千の呼び出しを表す可能性があり、1 秒あたり 100 ヒット x 1000 呼び出しを受け取った場合、コンパイラにそれらの数値を計算させることができたときに 100,000 呼び出しを無駄にしましたコンパイル時に 1 回。
このコードはプロセスの実行ごとに 1 回実行されるため、静的変数に値を入れることは重要ではありません。
last_update 変数は、ヒットした Web サイトに応じて変化することに注意してください (データベースから取得されます)。
コード
さて、コードを取得しました:
// helper (Days in February)
#define _SNAP_UNIX_TIMESTAMP_FDAY(year) \
    (((year) % 400) == 0 ? 29LL : \
        (((year) % 100) == 0 ? 28LL : \
            (((year) % 4) == 0 ? 29LL : \
                28LL)))
// helper (Days in the year)
#define _SNAP_UNIX_TIMESTAMP_YDAY(year, month, day) \
    ( \
        /* January */    static_cast<qint64>(day) \
        /* February */ + ((month) >=  2 ? 31LL : 0LL) \
        /* March */    + ((month) >=  3 ? _SNAP_UNIX_TIMESTAMP_FDAY(year) : 0LL) \
        /* April */    + ((month) >=  4 ? 31LL : 0LL) \
        /* May */      + ((month) >=  5 ? 30LL : 0LL) \
        /* June */     + ((month) >=  6 ? 31LL : 0LL) \
        /* July */     + ((month) >=  7 ? 30LL : 0LL) \
        /* August */   + ((month) >=  8 ? 31LL : 0LL) \
        /* September */+ ((month) >=  9 ? 31LL : 0LL) \
        /* October */  + ((month) >= 10 ? 30LL : 0LL) \
        /* November */ + ((month) >= 11 ? 31LL : 0LL) \
        /* December */ + ((month) >= 12 ? 30LL : 0LL) \
    )
#define SNAP_UNIX_TIMESTAMP(year, month, day, hour, minute, second) \
    ( /* time */ static_cast<qint64>(second) \
                + static_cast<qint64>(minute) * 60LL \
                + static_cast<qint64>(hour) * 3600LL \
    + /* year day (month + day) */ (_SNAP_UNIX_TIMESTAMP_YDAY(year, month, day) - 1) * 86400LL \
    + /* year */ (static_cast<qint64>(year) - 1970LL) * 31536000LL \
                + ((static_cast<qint64>(year) - 1969LL) / 4LL) * 86400LL \
                - ((static_cast<qint64>(year) - 1901LL) / 100LL) * 86400LL \
                + ((static_cast<qint64>(year) - 1601LL) / 400LL) * 86400LL )
警告: これらのマクロを使用して日付を動的に計算しないでください。mktime() より遅いです。ハードコーディングされた日付がある場合、コンパイラはコンパイル時に time_t 値を計算します。コンパイルは遅くなりますが、何度も実行すると速くなります。