1

我正在编写我正在编写的一个简单程序上分析 CPU 使用情况。我有不同的算法我想尝试,我也想知道对整个系统性能有什么影响。

目前,我正在使用 ualarm() 以 30Hz 执行一些指令;每 15 次中断(每 0.5 秒)我使用 getrusage() 记录 CPU 时间(以 u 秒为单位),因此我估计了该时间点 CPU 消耗的总 CPU 时间。但是要获得上下文,我还需要知道该时间段内系统中经过的总时间,这样我就可以获得我的程序使用的百分比。

/* Main Loop */
while(1) 
{
    alarm = 0;

    /* Waiting Loop: */
    for(i=0; !alarm; i++){
    }

    count++;

    /* Do my things */

    /* Check if it's time to store cpu log: */
    if ((count%count_max) == 0)
    {
        getrusage(RUSAGE_SELF, &ru);
        store_cpulog(f,
                (int64_t) ru.ru_utime.tv_sec,
                (int64_t) ru.ru_utime.tv_usec,
                (int64_t) ru.ru_stime.tv_sec,
                (int64_t) ru.ru_stime.tv_usec);
    }


}

我有不同的选择,但我不知道哪一个会提供最准确的结果:

  1. 用于ualarm计时。目前它被编程为每 0.5 秒发出一次信号,所以我可以将这 0.5 秒作为 CPU 时间。使用起来似乎很明显,但它是最好的选择吗?

  2. 用途clock_gettime(CLOCK_MONOTONIC):它提供具有nanosec分辨率的读数。

  3. 用途gettimeofday():提供具有usec分辨率的读数。我发现反对使用它的意见。

有什么推荐吗?谢谢。

4

2 回答 2

0

Callgrind is possibly the best application for profiling C/C++ code under linux. Use it with pride:)

于 2013-10-15T17:30:06.283 回答
0

可能的解决方案是使用系统功能时间并且不要在程序中使用忙循环(如@Hasturkun 说)。在控制台中调用:

time /path/to/my/program

执行后你会得到类似的东西:

real    0m1.465s
user    0m0.000s
sys     0m1.210s

不确定精度,如果它对你来说足够了。

于 2013-10-15T17:08:35.890 回答