性能优化简记七(C语言)

前面是从代码层次入手,讲解如何进行性能优化。但是对于大型的系统,代码有成百上亿行,总不能一行一行的进行解读优化。对这种大型项目,如何在短时间内提升性能呢?首先要找到性能瓶颈点。对于代码也存在“二八原则”,百分之二十的代码消耗了百分之八十的性能。如何找到并优化这百分之二十的代码,成为优化成败的关键。

排除法

很直观的方法,就是不断的关闭某些模块,查看性能变化,来确认热点模块。这种方法适合高类聚,低耦合的架构,对那种代码糅合在一起的,互相依赖的不太适用。优点是不使用额外工具,能够快速找到热点模块。缺点是只能精确到模块程度,不能精确到代码行,后续还需要结合其他方法继续对该模块进行优化。使用热点分析工具

针对不同的应用,性能有不同的侧重指标,比如吞吐量,文件读写速度,并发量,时延,内存大小,CPU等。针对不同的指标,我们可以选择合适的性能分析工具。perf

perf是Linux系统内核中自带的性能分析工具,在2.6.31以上内核中均有。原理就是通过设置断点条件,当断点条件触发时,读取CPU以及内核的相应的上下文信息,统计信息等,也就是采样,从而进行函数级和指令级的热点查找。

安装:sudo apt install linux-tools-common

设置断点条件:可以选择不同的断点条件进行采集。比如按照时间间隔tick设置断点条件,每一个tick中断采样一次,获取程序当前的上下文,也就是当前正在执行的函数及其调用链。这样经过多次采样,如果某个函数被采集的次数多,则说明该函数经常被调用。也可以按照cache miss来设置断点条件,当cpu发生cache miss时,会触发中断,进行采样,这样就能确定缓存的使用效率。

使用perf list可以查看,perf支持的断点条件。

上面只显示了部分,可以看到主要分为三类,Hardware表示是硬件中断事件,如cache miss,branch miss等;Software表示是软件中断事件,Kernel PMU表示是内核中断事件。很多中断事件的含义从字面理解即可,如果想详细查看该事件的定义,可以通过man perf-list查看相应的文档。

简单使用

使用perf stat命令,采集热点信息。可以通过man perf stat查看该命令的说明及其使用方法。下面以一个简单例子,简单说下用法,具体的更深入的了解,还得靠自己摸索。各个字段的含义,搜索即可获得。

可以看出perf stat 是通过采集信息,来获取整个程序的运行性能指标,但是如何查找瓶颈函数呢?可以通过perf record记录函数级的性能指标,并通过perf report命令显示出来。

命令分别为

perf record ./test1,

perf record

同样的,可以通过man查看其具体用法。

通过perf report显示的信息如上,可以看到各个函数的占用消耗,就能找到热点函数了。有些是内核调用函数,只能看能否通过其他方式减少对其的调用。

如果想知道其上下文关系,可以显示其函数调用链。命令分别如下:

perf record -g ./test1

perf report

perf的简单用法就写到这了,具体的更详细还需要本人去使用,去摸索。至少知道有这个东西,当遇见性能优化的时候,记得用上就行,针对具体问题再做具体分析。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();