[C++ 代码优化, 读书笔记] 程序中的优化点

1 篇文章 0 订阅

3.6  动态链接与和位置无关代码
    1. 静态链接比动态链接更快,因为省去了在运行时搜索函数的时间
    2. 位置无关代码出现UNIX或者Mac系统中,它们和共享对象有关,也比较耗时
    

3.7  文件访问
    1. 如果电脑有杀毒软件,那么文件访问会更加耗时,因为杀软会扫描所有的文件访问
    2. 顺序访问文件的内容比随机访问文件的内容更快(好像和缓存有关)
    3. 一次读取大块文件比一次读取几个字节更快(?原因未知)
    4. 将文件一次读到内存中进行操作再写回,比分好几次对文件进行不按顺序的读写更好(因为磁盘读写很耗时;如果存在缓存,可能就不是这种情况了)
    5. 文件的第一次访问比第一次之后的访问更慢,因为后面的访问可能名中了磁盘缓存
    6. 对应外设(U盘、软盘等),可能没有磁盘缓存,因此不建议多次读写
    7. 将数值类型存储成二进制比存储成ASCII码更节省空间也更高效,但是存储成二进制可能需要考虑大小端系统的差异
    8. 比较旧的文件操作可以放在一个单独的线程中执行,因为在读写的过程中,CPU可以不用等待磁盘完成,CPU可以自己去做一些别的操作
    

3.8  系统数据库
    1. 调用GetPrivateProfileStringand 和 WritePrivateProfileString之类的系统自带的配置读写函数时,真实读写的可能是数据库,因此配置的保存最好是放在自己创建的文件中
    
3.9 其他数据库
    1. 对于简单的情况,可以使用普通的文件代替数据库
    2. 添加索引可以将搜索的时间复杂度从O(n) 降到 O(lg2n)
    
3.10 图形界面
    1. 第三方的界面开发框架:在调用系统的API前加上一层逻辑,因此更利于跨平台,但是这层逻辑会花费更多的时间;因此第三方界面开发框架比原生的系统API更费时,但是可移植能力较好
    2. 一个图形界面函数底层需要调用设备驱动,因此调用图形界面函数需要切换到内核态然后再切换回来,所有只调用一次图形界面函数绘制多个图形比调用多次绘制多个图形更好
    3. 游戏和动画的图形绘制也很耗时,尤其是在没有图形处理单元的情况下
    
    
3.11 其他资源的访问
    1. 将数据写到某个输出设备时,最好将多次写入放在一起,因为该操作需要从用户态转换到内核态然后再转换回来
    2. 访问设备时的驱动加载、配置文件加载、系统模块加载等
    
3.12 网络访问
    1. 测试环境和线上环境比较大的区别是用户数量超载及用户距离要访问的资源较远,因此资源的访问频率决定了资源的存储位置
    2. 频繁的登陆流程也比较费时,应该考虑cookie之类的登陆方式
    
3.13 内存访问
    1. 缓存,介于寄存器和内存之间的存储空间,存在的目的主要是因为cpu计算的时间远远快于内存读写的时间,分为几级:L1一般8-64kb, L2一般256k-2M等 
    2. 提高缓存的命中率,可以缩短读写变量所花费的时间
    
3.14  上下文切换
    1. 在多任务、多线程的环境中,任务或者线程的切换会导致性能下降,因为在切换的过程中,data cache、code cache、分支目标缓存、分支模式历史等内容都换被替换

    2. 如果计算机的时间片更小,那么上下文切换将会更损耗性能

    3. 多处理器或者多核处理器会减少上下文切换的性能损耗

3.15 依赖链

   1. 现代处理器有一个特性,无序执行(out-of-order execution),有一段代码:先执行A然后执行B,如果B的执行并不依赖于A的结果,那么,如果执行B的速度快于A,则处理器可能会跳过A先执行B,或者同时执行A和B

   2. 为了让处理器能使用该特性,在编写代码时应该防止出现过长的依赖链,即后面的代码执行并不依赖于前面代码的执行结果

3.16 执行单元的吞吐量

1. 在现代处理器中,都包含多个执行单元(Execution unit):(一个或多个整型加减单元、一个或多个浮点加减单元、一个或多个浮点乘法单元), 这些单元都可以并行执行。

2. 当程序没有没有上述小节的时间消耗,同时也没有较长的依赖链,那么程序就会获得高性能的计算密集型,在这种情况下程序的性能受限于执行单元的吞吐量而不是延迟或者内存的使用权

3. 当一个程序在一个循环中计算浮点加法时,那么判断循环条件计数的时间不会计入浮点加法的时间,因为判断循环条件使用的执行单元于计算浮点使用的执行单元不同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值