杜宝坤
V1
2023/01/30阅读:23主题:全栈蓝
高性能编程精要
上面的章节中,我们介绍了高性能的网络编程,奠定了高性能服务的基础,本章将重点讲解下高性能服务。
本节偏重高性能服务的相关重点工作,并不会从开始编写一个高性能服务,重点讲解在高性能服务场景的一些经验。
-
尽量C语言化:
-
尽量使用底层裸指针,避免使用智能指针,避免引用技术开销; -
尽量减少分支与查表操作,根据程序逻辑,选择使用likely和unlikely。switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true. -
尽量使用位运算替换加减乘除法。 -
尽量减少使用STL(除了使用预分配内存的vector以外,可以考虑使用boost库里面的高效实现替换,比如queue);
-
-
尽量理解编译器:
-
更多的应用编译器,而不是运行时确认,比如:macro、inline、使用CRTP代替多态; -
深入理解编译器,比如Q3会降低程序的运行效率; -
尽量多使用static类型,减少dynamic类型,方便编译器优化; -
使用编译器的内置功能,比如__expected和__prefetch;
-
-
尽量平滑:减少数据拷贝和上线文切换
-
无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的 ID 按照 Hash 算法取模分段,不同的线程处理不同段的数据 -
CAS:避免加锁和线程阻塞 -
使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态 ,参考Redis的单线程模式; -
协程:在单线程实现多任务的调度,并在单线程里维持多个任务间的切换
-
-
尽量池化:使用线程池、内存池,尽量少作线程和内存的动态分配与销毁,高效设计与使用缓存,比如类似mysql的LIRS算法
-
高效的网络协议,PB化、压缩等;
-
高效的网络模型,epoll。
-
异步编程框架提升吞吐,非核心功能的异步处理,比如日志等;
作者介绍
杜宝坤
V1