gpt4 book ai didi

linux - 关于嵌套函数的性能最高结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:53 26 4
gpt4 key购买 nike

我们使用 perf top 来显示 CPU 使用率。结果显示两个函数

samples    pcnt    function
------ ---- ---------
... ... ....
12617.00 6.8% func_outside
8691.00 4.7% func_inside
.....

其实这两个函数是这样嵌套的,而且总是1对1嵌套。

func_outside() {
....
func_inside()
...
}

我是否应该得出结论,在 perf top 结果中,4.7% 实际上已经包含在 6.8% 中。如果排除 func_inside 的成本,func_outside 的成本是 2.1% (6.8-4.7)?

最佳答案

简答

没有报告的每个百分比仅针对该特定功能。所以 func_inside 样本不计入 func_outside

详情

perf 的工作方式是定期收集性能样本。默认情况下,perf top 只是检查当前正在运行的函数,然后将其添加到该函数的样本计数中。

我很确定是这种情况,但想验证这就是 perf top 显示结果的方式,所以我编写了一个快速测试程序来测试它的行为。该程序有两个有趣的函数outerinnerouter 函数在循环中调用 innerinner 所做的工作量由参数控制。编译时一定要使用 O0 以避免内联。命令行参数控制两个函数之间的工作比例。

使用参数 ./a.out 1 1 1000000000 运行得到结果:

49.20%  a.out             [.] outer    
23.69% a.out [.] main
21.32% a.out [.] inner

使用参数 ./a.out 1 10 1000000000 运行得到结果:

66.06%  a.out             [.] inner    
17.77% a.out [.] outer
9.50% a.out [.] main

使用参数 ./a.out 1 100 1000000000 运行得到结果:

88.53%  a.out             [.] inner    
2.85% a.out [.] outer
1.09% a.out [.] main

如果 inner 的计数包含在 outer 中,则 outer 的运行时间百分比将始终高于 inner。但正如这些结果所表明的那样,情况并非如此。

我使用的测试程序如下,是用 gcc -O0 -g --std=c11 test.c 编译的。

#include <stdlib.h>
#include <stdio.h>

long inner(int count) {
long sum = 0;
for(int i = 0; i < count; i++) {
sum += i;
}
return sum;

}

long outer(int count_out, int count_in) {
long sum = 0;
for(int i = 0; i < count_out; i++) {
sum += inner(count_in);
}
return sum;
}

int main(int argc, char **argv) {
if(argc < 4) {
printf("Usage: %s <outer_cnt> <inner_cnt> <loop>\n",argv[0]);
exit(-1);
}

int outer_cnt = atoi(argv[1]);
int inner_cnt = atoi(argv[2]);
int loops = atoi(argv[3]);

long res = 0;
for(int i = 0; i < loops; i++) {
res += outer(outer_cnt, inner_cnt);
}

printf("res is %ld\n", res);
return 0;
}

关于linux - 关于嵌套函数的性能最高结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922432/

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