2008-08-23 11 views
1

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 

答えて

3

:私はあなたがマイクロ秒の上位3桁にしたいことを集める

while (usec >= 1000) 
    usec /= 10; 

。その場合、私が考えることができる最も簡単な方法は、usecを1000で割って、それを使って行うことです。

テストケース:

  • 999999⇒999
  • 99999⇒999(099なければならない)
  • 9999⇒999(009なければならない)
  • 999⇒999(000なければならない)
2

おそらく、secとusecの構成のどこかにバグがあると思います。私はあなたが見ている種類のエラーを知らずに何を正確に言うことができません。大まかな推測では、usecは> 999999になることはありません。したがって、オーバーフローに頼って秒を調整するタイミングを知っています。また、あなたの期間の出力形式に問題があるかもしれません。

とにかく。出力に独自のrusageを作成するのではなく、utimeコンポーネントとstimeコンポーネントをfloat秒で保存してみませんか?私は次のことがあなたに適切な秒を与えるだろうと確信しています。

static int timeval_diff_ms(timeval const& end, timeval const& start) { 
    int micro_seconds = (end.tv_sec - start.tv_sec) * 1000000 
     + end.tv_usec - start.tv_usec; 

    return micro_seconds; 
} 

static float timeval_diff(timeval const& end, timeval const& start) { 
    return (timeval_diff_ms(end, start)/1000000.0f); 
} 

これを分解してrusageにしたい場合は、常にint-divとmoduloを使用できます。目的は何

0

@クリス:

私はあなたのusecの最も重要な3桁を望むことを集める。

はい。 usecの数字の桁数はさまざまで、1000未満の数字は切り捨てたいと思います。たとえば、usec=1000の場合は、結果100(1つではありません)を取得します。したがって、私は単純に1000で割ることはできません。

+0

usecの桁数がどのような意味を持つのかわかりません。私が知る限り、その中のすべての値は0〜999,999の間にあることを意味し、それぞれ0msと999.999msに相当します。 「最も重要な3桁の数字」は、ミリ秒のカウントを望むことを意味していました。私は間違ったことを読んだか? –

+0

Chris、@タグはいずれの方法でも動作していないようです。 あなたのコメントについて:私はこのコードでもう作業しませんし、私はもはや私が得たいと思ったものがもはや分かりません。 : -/AFAIR私はあなたの答えの999の数字を計算したかった、つまり、 "はずだ"とリストアップしたものではありませんでした。私は今あなたが正しいと思う。 –