gpt4 book ai didi

c++ - 我应该如何解释 OProfile 输出?

转载 作者:IT王子 更新时间:2023-10-29 00:31:17 27 4
gpt4 key购买 nike

我最近尝试使用 OProfile 分析我的应用程序。收集到的数据对我来说已经很有值(value)了,但我很难准确解释它。在设置并运行 oprofile 的情况下运行我的应用程序后,我生成了报告并得到:

root@se7xeon:src# opreport image:test -l -t 1
Overflow stats not available
CPU: P4 / Xeon with 2 hyper-threads, speed 3191.66 MHz (estimated)
Counted GLOBAL_POWER_EVENTS events (time during which processor is not stopped) with a unit mask of 0x01 (mandatory) count 750000
samples % symbol name
215522 84.9954 cci::Image::interpolate(unsigned char*, cci::Matrix const&) const
17998 7.0979 cci::Calc::diff(unsigned char const*, unsigned char const*)
13171 5.1942 cci::Image::getIRect(unsigned char*, int, int) const
5519 2.1765 cci::Image::getFRect(unsigned char*, double, double) const

好的,所以我的插值函数占应用程序执行时间的 84%(太长)。那么研究一下似乎是个好主意:

root@se7xeon:src# opannotate image:test --source
[...]

/* cci::Image::interpolate(unsigned char*, cci::Matrix<cci::Point2DF> const&) const total: 215522   84.9954 */  
1392 0.5529 :void Image::interpolate(CCIPixel *output, const Matrix<Point2DF> &inputPoints) const throw()
4 0.0016 :{
[...]
: col0 = static_cast<int>(point[idx].x);
3 0.0012 : col1 = col0+1;
629 0.2498 : row0 = static_cast<int>(point[idx].y);
385 0.1529 : row1 = row0+1;
56214 22.3266 : if (col0 < 0 || col1 >= m_width || row0 < 0 || row1 >= m_height)
: {
: col0 = row0 = col1 = row1 = 0;
: }

如果我没理解错的话,if 条件占程序执行时间的 22% 以上。左大括号和函数声明似乎需要时间,是否应该对应于函数调用开销(“压入堆栈、跳转、弹出参数”顺序)?

我更改了源代码中的一些东西(与后来的瓶颈有关,因为我不知道如何优化 if),重新编译,再次运行 oprofile(不要忘记 opcontrol --reset)。现在带注释的代码在同一个地方看起来像这样:

6  0.0024 :     curPx = point[idx].x;  
628 0.2477 : curPy = point[idx].y;
410 0.1617 : col0 = static_cast<int>(curPx);
57910 22.8380 : col1 = col0+1;
: row0 = static_cast<int>(curPy);
: row1 = row0+1;
: if (col0 < 0 || col1 >= m_width || row0 < 0 || row1 >= m_height)
: {
: col0 = row0 = col1 = row1 = 0;
: }

这次 if 基本上没有时间(?),最昂贵的指令是“col1 = col0 + 1”,整个时间 block 似乎已经向上移动了。怎么会这样?完全可以信任它来查明源中的瓶颈吗?

我还有一个疑惑是,我在设置opcontrol的时候,把traced event输入为GLOBAL_POWER_EVENTS,样本数是750k。在输出中,插值函数似乎占了84%,但里面记录的样本数只有200k多一点点。这甚至不到要求数量的 50%。我是否理解剩余的 ~500k 样本是由未在输出中列出的应用程序(内核、Xorg 等)采集的?

最佳答案

在分析优化代码时,您确实不能依赖准确的源代码行。编译器移动的东西太多了。

要获得准确的图片,您需要查看代码反汇编程序的输出。

关于c++ - 我应该如何解释 OProfile 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034517/

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