我试图在程序中使用“剩余”统计信息来获取类似于时间工具的数据。 但是,我很确定自己做错了什么。 这些值看似正确,但有时可能会有些怪异。 我在网上找不到很好的资源。 有人知道如何做得更好吗?

很抱歉输入长代码。

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

===============>>#1 票数:3 已采纳

目的是什么:

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

我收集到您想要用到的最高三位数字; 在这种情况下,我能想到的最直接的方法是将usec除以1000,然后完成此操作。

测试用例:

  • 999999⇒999
  • 99999⇒999(应该是099)
  • 9999⇒999(应该是009)
  • 999⇒999(应为000)

===============>>#2 票数:2

我认为sec和usec的组成中可能存在某个错误。 在不知道您所看到的错误类型的情况下,我无法真正说出确切的内容。 粗略的猜测是usec永远不会大于999999,因此您依靠溢出来知道何时调整sec。 持续时间输出格式也可能只是一个问题。

无论如何。 为什么不将utime和stime组件存储为浮点秒数,而不是尝试在输出上构建自己的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);
}

如果您想将其分解为俄文,则可以始终使用int-div和modulo。

===============>>#3 票数:0

@克里斯:

我收集到您想要usec的最高三位数字

是。 usec的位数总数各不相同,我希望将位数减少到1000以下。例如,如果usec=1000 ,我希望得到结果100(而不是您建议的1)。 因此,我不能简单地除以1000。

  ask by Konrad Rudolph translate from so

未解决问题?本站智能推荐:

2回复

使用/ usr / bin / time时如何忽略程序的输出?

我想知道程序运行了多长时间,所以我尝试了“/ usr / bin / time ./program> / dev / null”。 但很快我发现它显示程序的输出到stderr。 我尝试了“/ usr / bin / time ./program> / dev / null 2&g
2回复

在clock_gettime()中使用_COARSE变体仍会调用sys_clock_gettime()系统调用

我一直在使用Clock_gettime函数和CLOCK_MONOTONIC_COARSE作为代码中的第一个参数,如下所示: 但是,当我在代码上运行gperftools cpu profiler时,对__sys_clock_gettime的调用相对较高,大约为8.6%。 我检查了我对
1回复

NodeJS CPU使用率统计

注意 :这是在Windows上。 我有一个从pm2 start index.js --name dvc -- config.json的应用程序。 然后,我启动了一个新的命令窗口,以监视应用程序pm2 monit 。 为了测试应用程序,我使用Postman中的Runner选项,其中迭代次
1回复

查找快速进程的CPU使用率

我正在寻找一种方法来衡量在1秒内完成的进程的CPU使用率。 由于速度如此之快, top不能做到公平。 据我了解, top拍摄快照,因此可以在两次更新之间完成此过程。 该程序是C ++,我正在Linux上运行。 如果有一些简单的代码可以复制并粘贴到程序中,该代码可以在main()末
1回复

为什么对于没有多线程的Java程序,gtime命令返回的CPU使用率> 100%?

我尝试使用gtime命令(我相信这是Mac OSx等效于Unix time命令)来获取Java程序的执行时间。 但结果似乎令人困惑: 即使程序没有产生任何线程,CPU使用率仍显示> 100%。 即使我的代码中没有多线程,实时也比用户时间少。 这是我得到的:
1回复

在部分挂钟运行时间内测量守护程序CPU利用率

我正在处理与网络相关的守护进程:它将数据接收,处理并吐出。 我想通过分析该守护程序并降低其CPU使用率来提高其性能。 我可以使用gprof在Linux上轻松完成此操作。 但是,我还想使用“时间”之类的方法来衡量一段时间内的CPU总利用率。 如果可能,我希望将其计时的时间少于其总运行时间:
1回复

在Linux上使用time.time()进行性能分析

Linux上的time.time()似乎以us = 1/1000 ms精度产生当前时间。 我可以通过以下方式使用它来以ms精度分析函数吗:
4回复

如何在不使用模块的情况下分析子程序?

我很想重新回答这个问题'看看这块砖。 它属于哪种类型的房子?' 情况就是这样:我有效地被要求描述一些子程序,这些子程序既不能访问分析器(甚至是Devel::DProf ),也不能访问Time::HiRes 。 本练习的目的是“找到”瓶颈。 目前,我正在每个子文件的开头和结尾喷洒打
1回复

可以将supervisord用于程序的内存和CPU使用情况分析

我必须找到在一段时间内反复运行特定的api会导致内存泄漏。 我有一个简单的C程序,用于测试API一次。 我打算编译它并重复使用supervisord运行exe。 supervisord还可以分析程序的CPU和内存使用情况吗? 我在几个博客中广泛搜索,但没有找到关于supervi
1回复

如何使用gdb生成函数的所有回溯?

我有一个正在尝试检查的功能。 我想找到此函数的所有调用方,但是有一些问题: 我这样做是为了理解代码,因为我没有编写代码,但是我需要确切知道它的行为 它预先运行在STL中,所以我不能仅仅使用callgrind之类的东西callgrind直接调用者 在获取导致该函数被调用