どのようにシステム時間を文字列に追加しますか?
私の答えは、便利な機能を構築することです。
時間、分、秒だけが本当に必要な場合は、比較的遅いlocaltime()を使用する必要はありません。 (一方で、もっと必要があれば、変換のためにlocaltime_r()を使うべきだと思います)。
組み込みシステムの場合、いくつかの契約が戻ってくるので、私はこの変換が比較的遅い関数であることを発見し、それを回避することを選択しました。うるう日や世紀などを処理するためのアルゴリズムは、簡単に見えます。私は、変換を1秒間に何回もやろうとしていたそのアプリケーションで必要以上に計算しているので、単純に遅く思ったと思う。
モジュラ演算を含むより単純な(おそらくさらに高速な)アプローチが存在します。それは同じ - 時間(0)で始まります(そして、私はここで何をしているのかはlocaltime_r()関数では隠されていると思います)。サイドノート1 - 私の古いデルのUbuntu 15.10を実行している時、time(0)はウォールクロックへの最速のアクセスで、典型的な期間は約6または7 nsです。サイドノート2 - time_tはいつか変更されるかもしれません。 "time_t Wikipediaの記事でこれについていくつかのことを明らかにしています。結論として、time_tのタイプはC仕様で保証されていないということです。"
私は現在、便利なタイム・スタンプ列を生成するために使用するコード:静的項目
std::string hhCmmCssGet(time_t tt = 0) // tt has default value
{
time_t now = (tt ? tt : time(0));
static time_t prev = 0;
static char hhmmss[] = "hh:mm:ss";
if (prev != now)
{
prev = now;
const int32_t CST = -6;
int64_t hr = ((now/3600) % 24) + CST; // hr of day, CST offset
if (hr < 0) hr += 24;
uint64_t min = ((now/60) % 60); // min of day
uint64_t sec = (now % 60); // sec of day
std::stringstream ss;
ss << std::dec
<< std::setfill('0') << std::setw(2) << hr << ":"
<< std::setfill('0') << std::setw(2) << min << ":"
<< std::setfill('0') << std::setw(2) << sec;
for (size_t i=0; i<8; i++) // transfer new value
hhmmss[i] = ss.str()[i]; // into static hhmmss
}
std::string retVal(hhmmss);
return(retVal);
}
と句「(PREV =今!)場合」、この関数は、毎秒何千回も呼び出すことができるようにします...労力を大幅に削減しました。結局のところ、1秒あたり1秒しか更新されません。また、std :: stringstreamとモジュラ算術演算は1秒あたり1秒しか実行しないことに注意してください。
strftime、http://www.tutorialspoint.com/c_standard_library/c_function_strftime.htmを参照してください。 –