分类: C/C++
2013-02-03 18:19:35
性能分析的目的是为了找出“热点”,进而消除热点提高整体效率。只有找到那些最常被执行的20%代码,才能做到有的放矢。本文结合自己的使用经验介绍几个分析工具,并浅谈自己对程序优化的看法。
Opcontrol系列工具在Linux下普遍存在,支持基于时间和计时器两种方式的分析,进一步介绍可参考:http://www.ibm.com/developerworks/cn/linux/l-pow-oprofile/。但是在虚拟机环境中,默认事件都不被支持,只能使用计时器方式,设置方式如下:
opcontrol --deinit
rm -f /root/.oprofile/daemonrc
modprobe oprofile timer=1
另外,Opcontrol还是一个全局的性能分析工具,所以在虚拟机下分析结果不准确(根据我最近使用经验得来的,有可能是我使用方式的问题)。
gperftools包括高性能的内存分配器实现--TCMalloc,堆分析,堆检测,CPU分析工具,具体介绍见:。TCMalloc可以在多线程环境下高效管理内存,还可以归还空闲的内存归还给操作系统(通过调用madvise);对于需要大量动态申请内存且长期运行的服务,可以提高其效率和稳定性。用堆检测工具可以检测内存泄露,CPU分析工具可以分析性能热点,具体介绍可参考:http://www.ibm.com/developerworks/cn/linux/l-cn-googleperf/index.html。
VS2010集成开发环境(高级版及以上)包括了性能分析工具,可以进行如下几种分析:采样,检测,.NET内存分配,并发,介绍见:http://www.cnblogs.com/smark/archive/2011/10/12/2208039.html。
最后来总结下,如果是在Linux下,物理机推荐使用Opcontrol,虚拟机推荐使用gperftools(可以顺带检测内存泄露和堆分析);vs2010性能分析工具很强大,也比较方便,并且有独到之处--并发分析。性能分析工具有误差,需要多做几次取平均结果;特别注意代码中的sleep语句,位置是否合适,sleep长短是否合适。
很多人可能都知道过早优化是“万恶之源“,但是很难准确的判断是不是在过早优化。对于可以预见的性能热点,在设计时采用高效的算法或者牺牲一些可读性、增加点复杂度来提高效率,可能无可厚非;对于拿不准的性能热点,为了优化而提高复杂度,那就得不偿失了。程序集成测试后,做性能分析是十分有必要的,即使你没时间去针对热点进一步优化,可以使得你掌握程序的整体资源消耗情况,可以培养你的分析功底以便更准确的判断是不是在过早优化。