当前位置: 首页 > 科技观察

性能优化——一条命令发现性能问题

时间:2023-03-19 22:06:07 科技观察

本文转载自微信公众号《编程珠玑》,守望先生撰文。转载本文请联系编程诸暨公众号。原文链接:https://mp.weixin.qq.com/s/pZtqz2tl4ArbCnzdDdDPwQ为了获得程序的微小性能提升,大大增加了技术的复杂性和晦涩性能。这个业务不能做,不仅是因为代码容器的复杂性滋生了bug,还因为它们给以后的阅读和维护增加了难度。为什么性能优化可能是为了支持更高的吞吐量,更低的延迟,或者提高资源利用率等,这些都是性能优化的目标之一。但需要提醒的是,不要过早地进行性能优化。如果您现在没有任何性能问题,何必呢?当前一些有助于提高性能的编码习惯仍然可以一直保持。全面有针对性的性能优化并非易事。本系列文章无意介绍性能优化的原理或具体的算法优化。目的是分享一些实践中常用的技巧,同时也主要关注CPU。如何找到性能瓶颈解决性能问题的第一步就是找到性能问题。如何快速发现性能问题?对于这篇文章,如何找到让CPU忙的代码呢?为什么让CPU忙的代码在这里呢?比如完成一件事情,你可能只需要一个CPU时间片,但是因为代码不够好,还是需要多个CPU时间片。导致CPU非常繁忙,无法继续提高效率。top命令相信大家都用过,可以实时看到进程的一些状态。如何使用在很多文章中都有介绍,本文不再赘述。我们可以使用top命令查看某个进程占用的CPU,但是CPU占用率高并不代表它有性能问题。也可能是CPU在高速有效运行,没有占用厕所。很快发现我们一定都听说过82法则。同样,80%的性能问题集中在20%的代码中。因此,我们只要找到这20%的代码,就可以有效解决一些性能问题。本文使用的是perf命令,功能非常强大,支持的参数非常多,不过没关系,本文不打算一一介绍。系统中可能没有perf命令,可以通过以下方式安装ubuntu:sudoaptinstalllinux-tools-commonexample直接看例子吧。例子很简单,就是把字符串的字母转成大写。当然,很多人可能一眼就看出哪里有性能问题,但是没关系,这个例子只是为了说明perf的应用。//来源:公众号【编程明珠】//作者:看守先生//toUpper.c#include#include#include#include#include#include#defineMAX_LEN1024*1024voidprintCostTime(structtimeval*start,structtimeval*end){if(NULL==start||NULL==end){return;}longcost=(结束->tv_sec-开始->tv_sec)*1000+(结束->tv_usec-开始->tv_usec)/1000;printf("costtime:%ldms\n",cost);}intmain(void){srand(time(NULL));intmin='a';intmax='z';char*str=malloc(MAX_LEN);//应用失败则退出if(NULL==str){printf("failed\n");return-1;}unsignedinti=0;while(iresult$moreresult#Eventcount(approx.):23881569776##ChildrenSelfCommandSharedObjectSymbol#................................................................................................#100.00%0.00%toUpper[未知][k]0x03ee258d4c544155|---0x3ee258d4c544155__libc_start_main|--99.72%--strlen100.00%0.00%toUpperlibc-2.23.so[.]__libc_start_main|---__libc_start_main|--99.72%--strlen99.72%99.34%toUpperlibc-2.23.so[.]strlen|--99.34%--0x3ee258d4c544155这个也很清楚了。但是也不要高兴得太早,并不是所有的情况都能清楚的看出具体问题出在哪里。至于如何解决本文例子的性能问题,相信大家已经很清楚了。只需要在循环外提到strlen,这里不再赘述。综上所述,本文的例子过于简单粗暴,但足以说明使用perf快速找到程序中占用CPU高的部分。至于这部分能不能优化,是否正常,还需要进一步分析。不过不用担心,后面会分享一些常见的可以优化的性能点。作者:守望,linux应用开发者,目前在公众号【编程明珠】上分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。