杜宝坤

V1

2023/01/30阅读:23主题:全栈蓝

高性能编程精要

上面的章节中,我们介绍了高性能的网络编程,奠定了高性能服务的基础,本章将重点讲解下高性能服务。

本节偏重高性能服务的相关重点工作,并不会从开始编写一个高性能服务,重点讲解在高性能服务场景的一些经验。

  1. 尽量C语言化:

    1. 尽量使用底层裸指针,避免使用智能指针,避免引用技术开销;
    2. 尽量减少分支与查表操作,根据程序逻辑,选择使用likely和unlikely。switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true.
    3. 尽量使用位运算替换加减乘除法。
    4. 尽量减少使用STL(除了使用预分配内存的vector以外,可以考虑使用boost库里面的高效实现替换,比如queue);
  2. 尽量理解编译器:

    1. 更多的应用编译器,而不是运行时确认,比如:macro、inline、使用CRTP代替多态;
    2. 深入理解编译器,比如Q3会降低程序的运行效率;
    3. 尽量多使用static类型,减少dynamic类型,方便编译器优化;
    4. 使用编译器的内置功能,比如__expected和__prefetch;
  3. 尽量平滑:减少数据拷贝和上线文切换

    1. 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的 ID 按照 Hash 算法取模分段,不同的线程处理不同段的数据
    2. CAS:避免加锁和线程阻塞
    3. 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态 ,参考Redis的单线程模式;
    4. 协程:在单线程实现多任务的调度,并在单线程里维持多个任务间的切换
  4. 尽量池化:使用线程池、内存池,尽量少作线程和内存的动态分配与销毁,高效设计与使用缓存,比如类似mysql的LIRS算法

  5. 高效的网络协议,PB化、压缩等;

  6. 高效的网络模型,epoll。

  7. 异步编程框架提升吞吐,非核心功能的异步处理,比如日志等;

分类:

后端

标签:

后端

作者介绍

杜宝坤
V1