如何使用profile工具来解决程序中的瓶颈 --linux篇
如何使用profile工具来解决程序中的瓶颈 --linux篇我们在写程序,通常需要对程序的性能进行分析,以便程序能够更快更好地运行。如果程序很大,分析起来就很困难。这些涉及程序优化的问题,优化一般都是“case by case”的。
首先,遇到程序慢问题时候不能凭感性认识,觉得这是由于单核单线程造成的,就一味的去用openMP或别的去把程序改成多线程或并行(除非你的电脑是双核),甚至去换电脑。这种“
黄金锤”的做法就是关键时候用屁股代替了脑袋。
于是,一定要找到真正的程序bottleneck所在。到底是不是你的程序随机访问内存情况太多导致Cache miss 太多,对于图像处理,关键首先是算法吧,用一个O(N)的显然比O(N2)的要快。然后是实现方面的一些优化,比如尽量使用整数而不是浮点数,尽量减少乘、 除这类复杂算法而使用加法和移位。佷多时候一维存取要比二维快佷多。另外,字节对齐也是一个很重要的方面。佷多图像处理库中的图像内存都是字节对齐的。
然后,在Linux下,可以根据gprof产生的统计结果用kprof打开,查看那个函数占用的CPU时间最多,调用频度如何,系统时间和用户时间等各个要素;如果是Solaris系统,vmstat, mpstat, iostat, dbx 等工具产生的统计信息也相当详尽, 结合代码的实现逻辑进行 分析就是了。
这里介绍一种Linux下程序的Profiling工具---
GNU gprof。
GNU gprof能够打印出程序运行中各个函数消耗的时间,可以帮助程序员找出众多函数中耗时最多的函数。产生程序运行时候的函数调用关系,包括调用次数,可以帮助程序员分析程序的运行流程。
gprof的基本用法:
1. 使用 -pg 选项编译和链接你的应用程序
在gcc编译程序的时候,加上-pg选项,例如:
gcc -pg -o test test.c
这样就生成了可执行文件test。如果是大项目,就在makefile里面修改编译选项,-pg放在那里都行。
2. 执行你的应用程序使之生成供gprof 分析的数据
运行刚才的程序:./test,这样就生成了一个gmon.out文件,该文件就包含了profiling的数据。
3. 使用gprof 分析你的应用程序生成的数据
gprof test gmon.out > profile.txt
使用上面的命令,gprof就可以分析程序test的性能,将profiling的结果放在profile.txt文件中,打开就可以看到分析的结果。通过对结果的分析来改进我们的程序,从而达到我们的目的。
win下面可以用intel的vtune,或者visual studio自带的profile工具。我觉得对于图像处理而言,除非算法的瓶颈在数据IO上,否则多线程很难有优化作用,因为线程调度的开销无法抵消。当然双核处理器除外。