谈谈性能优化

性能指标

API接口:每次调用耗时 或 QPS
网络服务端: Throughput (吞吐,即QPS)+ Latency (调用延迟)

性能测量的方法

  • 性能分析工具:如c++下有perf/gprof,go下有pprof
    使用这类工具可以帮你发现性能瓶颈
  • 时间测量:通过使用时间测量方式来看程序执行发了多少时间
    Linux下常用的有clock_gettime, gettimeofday等命令,获取起止时间后相减即可,亦可将其包装为一个timer类,然后插入程序代码段中来测量

常见的性能优化方法

性能优化本质上是减少CPU执行的指令数,代码实现中常用的一些方法如下:

字符串处理: 预留空间,使用append操作拼接和右值拷贝避免临时字符串,减少char*与string的转换等
零拷贝:使用指针或引用、右值操作,写时复制COW,减少对象的copy
内存映射内存管理:内存池与对象池、缓存,高性能内存管理库(如TCMalloc)
无锁化:双buffer,原子操作,thread local变量
算法优化:使用更好的算法,算法调优;数据结构调优,如c++不需要排序场景中的kv操作可以使用unordered_map替换map;使用增量替换全量
网络调用方面:序列化方法(如使用更加紧凑的序列化方式,如pb替代json),数据压缩,使用连接池/线程池(网络IO),使用writev减少系统调用次数
使用异步编程方式提高并发:异步调用/协程调用,异步调用如c++的promise/future,std::async,协程调用如go语言的go routine,c++业界常用的一些协程库如微信的libco,百度的brpc bthread;使用reactor方式(如epoll)实现网络调用全异步

性能优化相关的命令

下面列一些常用的命令,具体使用方式可自行Google或查看命令的man手册

  • top
    查看每个进程的cpu使用率, top -H -p PID,在top命令显示页面上进一步按1,可以看到某个具体cpu的使用率情况

  • perf
    查看CPU在哪个函数上耗时高:perf top -K -p PID
    扫描系统在各个函数上的耗时,用于生成火焰图:perf record -e cpu-clock -g -p PID

  • iftop
    用于查看网卡带宽的使用情况,如查看网卡1:iftop -i eth0
    性能测试中可能由于网卡打满,造成QPS上不去,这时就需要使用此命令来确认

  • iostat
    用于输出CPU和磁盘输入输出、分区、网络文件系统NFS相关的统计信息

  • time
    可以列出命令的用户态和内核态的执行时长

相关书籍

由于本人主要使用c++语言,这边推荐下的有《c++性能优化指南》、《Effective C++》、 《MoreEffective C++》、 《EffectiveSTL》、《C++Concurrency in action(C++并发编程实战)》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值