首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“rusage”统计信息

“rusage”统计信息
EN

Stack Overflow用户
提问于 2008-08-23 12:57:16
回答 2查看 2.8K关注 0票数 1

我正在尝试在我的程序中使用“rusage”统计信息来获取类似于time工具的数据。然而,我很确定我做错了什么。这些值似乎是正确的,但有时可能有点奇怪。我没有在网上找到好的资源。有人知道怎么做得更好吗?

抱歉,代码太长了。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2008-09-16 11:32:18

的目的是什么:

代码语言:javascript
复制
while (usec >= 1000)
    usec /= 10;

我猜你想要usec的最高有效的三位数;在这种情况下,我能想到的最直接的方法是将usec除以1000,然后就完成了。

测试用例:

  • 999999⇒999
  • 99999⇒999 (应为099)
  • 9999⇒999 (应为009)
  • 999⇒999(应为000)
票数 3
EN

Stack Overflow用户

发布于 2008-08-25 20:40:54

我想你的sec和usec组合中可能有个bug。如果不知道您所看到的错误类型,我就不能确切地说出是什么。粗略的估计是usec永远不能大于999999,所以你要依靠overflow来知道什么时候调整sec。这也可能是你的持续时间输出格式的问题。

不管怎么说。为什么不将utime和stime组件存储为浮点数秒,而不是尝试在输出上构建自己的策略?我很确定下面的内容会给你适当的时间。

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档