timeツールと似たデータを取得するために、私のプログラムで "rusage"統計を使用しようとしています。しかし、私は間違ったことをやっていると確信しています。値はほぼ正しいように見えますが、時には奇妙なこともあります。私は良いリソースをオンラインで見つけられませんでした。誰かがそれをより良くする方法を知っていますか?"rusage" statistics
申し訳ありませんが、長いコードです。
class StopWatch {
public:
void start() {
getrusage(RUSAGE_SELF, &m_begin);
gettimeofday(&m_tmbegin, 0);
}
void stop() {
getrusage(RUSAGE_SELF, &m_end);
gettimeofday(&m_tmend, 0);
timeval_sub(m_end.ru_utime, m_begin.ru_utime, m_diff.ru_utime);
timeval_sub(m_end.ru_stime, m_begin.ru_stime, m_diff.ru_stime);
timeval_sub(m_tmend, m_tmbegin, m_tmdiff);
}
void printf(std::ostream& out) const {
using namespace std;
timeval const& utime = m_diff.ru_utime;
timeval const& stime = m_diff.ru_stime;
format_time(out, utime);
out << "u ";
format_time(out, stime);
out << "s ";
format_time(out, m_tmdiff);
}
private:
rusage m_begin;
rusage m_end;
rusage m_diff;
timeval m_tmbegin;
timeval m_tmend;
timeval m_tmdiff;
static void timeval_add(timeval const& a, timeval const& b, timeval& ret) {
ret.tv_usec = a.tv_usec + b.tv_usec;
ret.tv_sec = a.tv_sec + b.tv_sec;
if (ret.tv_usec > 999999) {
ret.tv_usec -= 1000000;
++ret.tv_sec;
}
}
static void timeval_sub(timeval const& a, timeval const& b, timeval& ret) {
ret.tv_usec = a.tv_usec - b.tv_usec;
ret.tv_sec = a.tv_sec - b.tv_sec;
if (a.tv_usec < b.tv_usec) {
ret.tv_usec += 1000000;
--ret.tv_sec;
}
}
static void format_time(std::ostream& out, timeval const& tv) {
using namespace std;
long usec = tv.tv_usec;
while (usec >= 1000)
usec /= 10;
out << tv.tv_sec << '.' << setw(3) << setfill('0') << usec;
}
}; // class StopWatch
usecの桁数がどのような意味を持つのかわかりません。私が知る限り、その中のすべての値は0〜999,999の間にあることを意味し、それぞれ0msと999.999msに相当します。 「最も重要な3桁の数字」は、ミリ秒のカウントを望むことを意味していました。私は間違ったことを読んだか? –
Chris、@タグはいずれの方法でも動作していないようです。 あなたのコメントについて:私はこのコードでもう作業しませんし、私はもはや私が得たいと思ったものがもはや分かりません。 : -/AFAIR私はあなたの答えの999の数字を計算したかった、つまり、 "はずだ"とリストアップしたものではありませんでした。私は今あなたが正しいと思う。 –