gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:16:17 25 4
gpt4 key购买 nike

clock() 能否用作可靠的 API 来测量 CPU 执行一段代码所花费的时间?当验证 usng 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;
}

结果好像是说对memset()一个100KB的chunk,500次,没有耗时。还是说不能用微秒来衡量?

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

谢谢!

最佳答案

关于最近的 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;
}
}

如果您只关心每个进程的统计信息,getrusage 会更容易。但是,如果您想准备在每个线程的基础上执行此操作,则此技术比文件名更好,代码对于获取每个进程或每个线程的数据将是相同的。

* - 我不确定引入统计文件的确切时间。您将需要验证您的系统是否有它。

关于c - 在 Unix/Linux 上用 C 测量一段代码占用的 CPU 时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2040257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com