C++ “俄罗斯时代”统计
我试图在我的程序中使用“rusage”统计数据来获得与该工具类似的数据。然而,我很确定我做错了什么。这些值似乎是正确的,但有时可能有点奇怪。我没有在网上找到好的资源。有人知道如何做得更好吗 抱歉,代码太长了C++ “俄罗斯时代”统计,c++,unix,time,profiling,C++,Unix,Time,Profiling,我试图在我的程序中使用“rusage”统计数据来获得与该工具类似的数据。然而,我很确定我做错了什么。这些值似乎是正确的,但有时可能有点奇怪。我没有在网上找到好的资源。有人知道如何做得更好吗 抱歉,代码太长了 class StopWatch { public: void start() { getrusage(RUSAGE_SELF, &m_begin); gettimeofday(&m_tmbegin, 0); } voi
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
我认为在你的sec和usec组合中可能有一个bug。如果不知道你看到的错误种类,我真的说不出确切的原因。粗略的猜测是,usec永远不会大于999999,所以您依赖于溢出来知道何时调整秒。这也可能只是持续时间输出格式的问题 无论如何。为什么不将utime和STIM组件存储为浮点秒,而不是尝试在输出上构建自己的rusage?我很确定下面的内容会给你适当的时间
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。我认为在你的sec和usec组合中可能有一个bug。如果不知道你看到的错误种类,我真的说不出确切的原因。粗略的猜测是,usec永远不会大于999999,所以您依赖于溢出来知道何时调整秒。这也可能只是持续时间输出格式的问题 无论如何。为什么不将utime和STIM组件存储为浮点秒,而不是尝试在输出上构建自己的rusage?我很确定下面的内容会给你适当的时间
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。其目的是什么:
while (usec >= 1000)
usec /= 10;
我推测您需要usec最重要的三位数字;在这种情况下,我能想到的最直接的方法是将usec除以1000,然后用它来完成
测试用例:
999999⇒ 999
99999⇒ 999应该是099
9999⇒ 999应该是009
999⇒ 999应该是000
其目的是什么:
while (usec >= 1000)
usec /= 10;
我推测您需要usec最重要的三位数字;在这种情况下,我能想到的最直接的方法是将usec除以1000,然后用它来完成
测试用例:
999999⇒ 999
99999⇒ 999应该是099
9999⇒ 999应该是009
999⇒ 999应该是000