入力データの量に応じて、数秒または数日で実行されるプログラムがあります。プログラムの最後に、経過した「クロックウォール」時間を出力したいと思います。1分未満の場合は秒単位、1時間未満の場合は分秒単位、1時間未満の場合は時分秒単位1 日未満、それ以外は日-時-分-秒。私が使用しているコードは次のとおりです。
#include <cstdio>
#include <ctime>
#include <unistd.h> // for sleep
int main (int argc, char ** argv)
{
time_t startRawTime, endRawTime;
time (&startRawTime);
printf ("%s", ctime (&startRawTime));
sleep (3); // any preprocessing of input data
time (&endRawTime);
printf ("%s", ctime (&endRawTime));
printf ("%.0fs\n", difftime (endRawTime, startRawTime));
time_t elapsed = static_cast<time_t>(difftime (endRawTime, startRawTime));
struct tm * ptm = gmtime (&elapsed);
printf ("%id %ih %im %is\n", ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);
return 0;
}
印刷されるものは次のとおりです。
Mon Apr 9 14:43:16 2012
Mon Apr 9 14:43:19 2012
3s
1d 0h 0m 3s
もちろん、最後の行は間違っています ("0d" のはずです)。印刷することで簡単に解決できそうptm->tm_mday - 1
です。ただし、ptm->tm_mday
2 つの日付の間に実際に 1 日が経過した場合も「1」になります。その場合、「0d」として表示させたくありません。
それで、これを適切に処理する方法はありますか?または、結果をdifftime
double (つまり、秒数) として取得してから、秒/分/時間/日の数を自分で計算する必要がありますか?
備考: 私のコードは Linux でのみ使用され、 でコンパイルされていgcc -lstdc++
ます。