测量一段代码占用的CPU时间,在Unix/Linux上的C中

rag*_*ava 6 c unix performance

clock()可以用作可靠的API来测量CPU执行代码片段所花费的时间吗?当使用times()/ clock()验证时,两者似乎都不能精确测量所花费的CPU时间.

首先,可以使用API​​ clock()/ times()来测量函数/代码片段的执行时间,如下例所示?有没有更好更可靠的选择?该机制适用于Linux,HP-UX,IBM-AIX和Sun Solaris,因为我们需要测量(和&比较)所有这些平台上的一段代码的性能.

请建议.另外,如果我遗漏了任何微不足道的事,请告诉我.

bbb@m_001:/tmp/kk1$ ./perf_clock 102400
{clock(): S          0 E          0 D    0.0000000000}
bbb@m_001:/tmp/kk1$ ./perf_clock 204800
{clock(): S          0 E      10000 D    0.0100000000}
bbb@m_001:/tmp/kk1$ cat perf_clock.c

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

void test_clock(char* sbuf, int* len){
    clock_t start, end; int i=0;
    start = clock();
    while(i++ < 500) memset((char*)sbuf,0,*len);
    end = clock();
    printf("{clock(): S %10lu E %10lu D %15.10f}\n",
        start,end,(end-start)/(double) CLOCKS_PER_SEC);
}
int main(int argc,char* argv[])
{
        int len=atoi(argv[1]);
        char *sbuf=(char*)malloc(len);
        test_clock(sbuf,&len);
        free(sbuf); return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果似乎说memset()一个100 KB的块,500次,没有时间花.还是说它在几微秒内无法测量?

实际上,它不是memset()而是另一个函数[准备一个大小约1MB的巨大结构,mallocs这个结构的副本,Oracle DB选择并使用来自DB的数据填充这些结构]我试图测量.即使这显示0滴答,这也让我感到困惑.

谢谢!

R S*_*hko 7

在最近的Linux(*)上.您可以从/ proc文件系统获取此信息.在文件中/proc/PID/stat,第14个条目具有用户区代码中使用的jiffies数,第15个条目具有系统代码中使用的jiffies数.

如果要基于每个线程查看数据,则应该引用该文件/proc/PID/task/TID/stat.

要将jiffies转换为微秒,可以使用以下命令:

define USEC_PER_SEC         1000000UL

long long jiffies_to_microsecond(long long jiffies)
{
    long hz = sysconf(_SC_CLK_TCK);
    if (hz <= USEC_PER_SEC && !(USEC_PER_SEC % hz))
    {
        return (USEC_PER_SEC / hz) * jiffies;
    }
    else if (hz > USEC_PER_SEC && !(hz % USEC_PER_SEC))
    {
        return (jiffies + (hz / USEC_PER_SEC) - 1) / (hz / USEC_PER_SEC);
    }
    else
    {
        return (jiffies * USEC_PER_SEC) / hz;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您关心的是每个进程的统计信息,getrusage则更容易.但是如果你想准备在每个线程的基础上做这个,这个技术比文件名更好,代码对于获取每个进程或每个线程的数据是相同的.

* - 我不确定何时引入了stat文件.您需要验证您的系统是否具有该功能.

  • `BLTPR_USEC_PER_SEC`的`define`(大概是``define`)是否意味着在后面的代码中使用? (2认同)

And*_*ndy 5

我会尝试getrusage并检查系统和用户时间.

还要检查gettimeofday以与挂钟时间进行比较.

  • 谢谢!getrusage()听起来很有希望.但gettimeofday(),我很怀疑.我需要测量仅用于我的进程的CPU时间.由于需要考虑不同的系统负载,测量挂钟时间似乎不是一种正确的方法.如果我错了,请纠正我. (3认同)

zmb*_*ush 1

您可以使用它clock_t来获取自程序启动以来的 CPU 滴答数。

或者你可以使用linuxtime命令。例如:时间[程序][参数]