IE盒子

搜索
查看: 237|回复: 1

C++高性能编程:概览

[复制链接]

2

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2022-10-7 11:44:44 | 显示全部楼层 |阅读模式
本专栏持续更新中,边学习边分享:现代C++、C++多线程编程、cuda编程等内容。
C++之父Bjarne Stroustrup把c++定位于侧重系统编程的通用程序设计语言,C++性能优势很大程度上得益于对内存布局的精确控制,尽可能减少内存碎片。它给程序猿大展身手的机会,你可以精确控制对象销毁和内存释放时机,不必容忍垃圾回收机制(GC)带来的延时。
因此在对性能有高要求的领域总能看见它的身影,如:

  • 对于分布式系统(数千台服务器)、嵌入式设备而言,提高运行效率就意味着更低的成本;
  • 对于游戏、高频交易而言,提高性能就是增强用户体验;
但C++的协作性不如C、Java、Python,开源项目也少的多。但随着计算能力的提高,其他高级语言也逐渐弥补性能差距,反而是c++的内存泄漏、开发效率低下等问题让人捉襟见肘。不过,近年来芯片的紧缺、自动驾驶的火热又让C++在TIOBE语言流行榜上节节攀升。
学习C++

入门:《C++ Primer》注意不是Plus
如果想成为专业的C++开发者,恐怕不能用“撸起袖子加油干,边google边学习”这种方式来学习它。因为它的语言特性的关联性很强,复杂度也成倍增加。为了避免养成坏的编程习惯,全面系统的学习必定是一本大部头书籍。
标准库:《STL 源码剖析》
书看不进去,更建议看侯捷老师的视频。作为新手能够正确使用STL即可,然后再学习STL中十分重要的萃取机、内存分配器、迭代器设计模式。在学习之前先设想一下:如何将算法、仿函数、容器等耦合在一起。
至于源码,其实不建议一上来就看,STL是泛型编程,很容易让新手陷入语法沼泽,力气用错了地方。
程序设计规范:《Effective C++》
学语法,和熟练运用是两回事。C++是遍布陷阱的语言,吸取经验丰富程序猿的建议很重要。看完之后,深深怀疑自己真的对写C++吗?书篇幅很短,语言精练,一两天就能读完,是必读的进阶书籍。
现代c++:《现代C++教程》、《Effective Modern C++》
C++11/14/17 新标准慢慢成为 C++ 开发主流,相比较 C++98/03,C++11 是变化和改动最多的一个版本,其中很多特性像智能指针、函数式编程都是神兵利器。可参考前者《现代C++教程》快速上手,后者是Scott Meyers大师又一effective系列的力作。
泛型编程:《C++ template》、MyTinySTL
泛型编程,又或者说是模板编程,与其他知识点联系较少,在实际生产代码中也比较少涉及,毕竟不是谁都要写标准库的。应该先抓住主线,可以放一放。
如果学完了泛型编程,可以阅读MyTinySTL源码,同时巩固现代c++、泛型和STL。
多线程编程:《C++并发编程实战》、《linux 多线程服务端编程-使用muduo C++网络库》
时至今日,为了充分利用多核cpu,多线程编程是程序猿的必备技能。但多线程编程比单线程的难度陡增,操作系统相关知识是C++多线程编程的前提。
前本书是来自编写C++多线程标准库的作者,内容涵盖广,注意第一版翻译巨坑,建议看第二版翻译。
后本书是linux C++后端的必读书目,虽然不从事后端方向,但其中讲述的多线程编程的正规做法让我受益匪浅。
C++内存管理

内存管理是C++非常重要的知识点,也是新手前进路上的拦路虎:

  • 什么是编写C++项目的最头疼的问题?是各种指针错误;
  • 什么是C++性能优势的主要体现?是对内存的精确管理;
  • 什么是C++编程中最重要的编程技法?是RAII;
指针是C++代码的常客,连多态都需要通过指针来实现。这也导致各种指针错误层出不穷,我们常说成也指针,败也指针。
那么介绍一下C++中可能出现的内存问题与解决方法(参考自《linux 多线程服务端编程》):

  • 缓冲区溢出:用std::vector管理缓冲区,通过成员函数而不是裸指针来修改缓冲区;
  • 空悬指针/野指针:用智能指针;
  • 重复释放:用智能指针;
  • 内存泄漏:用智能指针;
  • 不配对的new[]/delete:用std::vector/scoped_array;
  • 内存碎片:先按下不表;
可见,在现代C++中,我们应该极力避免new和delete,用容器(vector等)和智能指针来管理内存,那么完全可以不必为了指针和内存错误操心。而且智能指针中的shared_ptr/weak_ptr也适用于多线程代码。那么我们唯一需要劳神费心的是智能指针引起的循环引用,通过修改代码设计,也在可控范围内。

  • 深度学习可好玩了:C++内存管理:RAII与智能指针
  • 深度学习可好玩了:C++内存管理:shared_ptr/weak_ptr源码(长文预警)
  • 深度学习可好玩了:C++STL中的内存分配器
C++多线程编程

线程同步的四项原则(参考自《Real-world Concurrency》):

  • 首要原则是尽可能最低限度地共享对象,减少需要同步的场合。如果要暴露,优先考虑immutable对象;
  • 使用高级成熟的并发编程构件,如TaskQueue、Producer-Consumer Queue、CountDownLatch;
  • 最后不得已使用底层同步原语,只用非递归的互斥锁和条件变量,慎用读写锁,不要用信号量;
  • 除了使用atomic整数之外,不自己编写lock-free代码,也不要用“内核级”同步原语。不凭空猜测哪种做法性能更好,比如自旋锁 vs 互斥锁。


  • 深度学习可好玩了:C++多线程编程:线程同步精要
  • 深度学习可好玩了:C++多线程编程:基于现代C++的多线程库
  • 深度学习可好玩了:C++多线程编程:期望future
  • 深度学习可好玩了:C++多线程编程:原子类型与内存顺序
Cuda编程

深度学习的三大马车:算法、数据、计算能力。计算能力这一层依赖于GPU,英伟达家更是把AI作为显卡的主打应用方向。作为一个合格的deep learner,学习GPU的相关知识还是很有必要的,不仅可以为pytorch框架编写自定义算子cuda拓展,而且学习GPU的底层组成原理,更有助于我们优化模型。

  • (零)cuda编程笔记概览
  • (一)cuda编程首次尝试
  • (二):组织并行线程
  • (三):硬件线程组织结构
  • (四):存储系统结构
其他


  • 深度学习可好玩了:C++STL中的萃取器traits
  • 深度学习可好玩了:C++异常安全与copy and swap惯用法
回复

使用道具 举报

5

主题

9

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2022-10-7 11:45:39 | 显示全部楼层
有没有推荐的诸如pytorch/paddle源代码阅读文章?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表