在开始使用gcc 11 of Ubuntu 22.04之后,我注意到我的c应用程序性能下降了90%--这是我衡量它的方法。
缩小范围后,我看到了自gcc 8.4.0-3ubuntu2以来出现的退化。
现在我正在使用Ubuntu 22.04使用gcc-7和gcc-8 (和gcc,也就是gcc 11)。
用gcc-7编译完全相同的代码有很好的效果,而用gcc-8 (或gcc 11)编译会导致应用程序变慢。
我没有在gcc 8变中找到任何应该重要的更改。
我没有简单的申请。如果我有这意味着我已经知道这个问题的来源了。
有什么建议吗?
从gcc 7.5到gcc 8.4,有什么变化吗?
**编辑** -在gprof of old-fast (使用gcc-7)和new-slow (使用gcc-8)之后,我认为最有价值的事情是,在new-slow版本中有这样的条目,位于Flat profile的第二位
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls s/call s/call name
39.27 9.83 9.83 173488 0.00 0.00 main_function
22.89 15.56 5.73 ...
...发布于 2022-09-07 13:37:57
那好吧,
情况就是这样:
出于某种原因,gcc-7并不关心它,但是自从gcc-8之后,它就成了一个问题。
如您所见,在main_function()堆栈上有一个大数组实例化。
sizeof(my_big_struct) -> 100
伪码:
void main_function() {
my_big_struct bigstruct_arr[20000];
...
}gcc-7运行时没有任何问题gcc-8 (和11)也在运行,但速度确实很慢。我不知道为什么。分配的时间太多了?或者数组访问?正如您从perf中看到的那样,它确切地说,main_funcion()是问题所在。
这有点误导,因为地址0x5594faaa3090承担了所有的错误。
我不明白这个地址是什么意思,直到我知道,这是数组bigstruct_arr。
Samples: 36K of event 'cycles', Event count (approx.): 13441606624
Children Self Command Shared Object Symbol
- 90.47% 88.88% trd_1 my_process [.] main_function
+ 88.26% 0x5594faaa3090
+ 1.60% main_function
0.61% 0当然,解决方案是用全局或malloc来定义它。
https://stackoverflow.com/questions/73599291
复制相似问题