性能优化高手课
尉刚强
资深软件设计咨询顾问
19574 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 31 讲
性能优化高手课
15
15
1.0x
00:00/00:00
登录|注册

14 | 内存使用篇:如何高效使用内存来优化软件性能?

你好,我是尉刚强。今天,我们来聊聊如何通过内存的高效使用,来进一步优化和提升软件性能。
软件的实现是通过变量和变量之上的计算逻辑组成的,而在计算机运行期间,变量主要依赖于内存来承载。所以,如何高效地使用内存,就成为了高性能编码优化的重要手段之一。而在软件编码的过程中,不同实现方式对内存的影响,则主要体现在这三个场景:内存的空间与布局内存的申请与释放内存的读取与修改
不过就我的观察发现,很多研发团队在软件的开发阶段,并不会去关注内存使用优化,这样当业务上线后,伴随着用户规模的快速增长,各种内存引起的性能问题就逐渐暴露出来了,比如内存空间不够、内存操作引起比较大的时延抖动等。
只有到了这个时候,他们才会意识到内存使用优化的重要性,但这时与内存相关的代码实现已经侵入业务的各个地方,调整重构变得举步维艰。所以可见,我们应该在编码实现的过程中,就去掌握优化内存使用的技巧和方法,以避免软件后期引起比较严重的性能问题。
那么今天这节课,我就会从这三个场景出发,带你了解如何通过不同的编码方式,来调整优化内存使用效率,从而提升软件性能。
不过在开始之前,我要先说明一点,就是不同编程语言的语法、解析运行机制的差异都很大,在高性能编码实现的技巧手法上也都不太一样。所以今天,我主要是以使用范围和人群都很广泛的 Java 语言为主,给你讲解如何从内存使用的角度进行高性能编码,从而开发出性能更加优越的软件。而在一些特定场景下,我还会选用一些 C/C++ 代码片段进行对比分析,这样有助于你理解背后的原理与意义。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了如何通过高效利用内存来提升软件性能。作者从内存的空间与布局、内存的申请与释放、内存的读取与修改三个方面出发,提出了多种优化方法。在内存的空间与布局优化方面,强调了按照变量存储信息量选择对应的类型定义和对齐对象实例内的变量空间两种优化思路。针对内存的申请与释放优化,介绍了调整内存申请释放发生的时间点、减少内存的申请与释放次数以及定制化内存申请与释放实现等优化手段。此外,还提到了对象池共享技术,通过集合管理已经申请过的对象来提高软件的运行速度和性能。文章还深入讨论了内存的读取与修改优化,包括Cacheline对齐、伪共享问题、以及在不同编程语言中优化内存读取和修改的手段。总的来说,本文通过具体的例子和对比分析,帮助读者理解了内存使用优化的重要性以及具体的优化方法,对于软件开发人员来说具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《性能优化高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • Geek_094d56
    老师: 请问c++怎么减少伪共享呢?

    作者回复: 你可以考虑将共享内存统一规划使用。

    2021-06-23
    2
  • 全麦小面包
    老师,您好。Disruptor中,有一段防止伪共享的代码我没看明白。 https://github.com/LMAX-Exchange/disruptor/issues/158 就像上面提问的那样,为什么数组前后填充128字节?而不是64字节? (代码:this.entries = new Object[sequencer.getBufferSize() + 2 * BUFFER_PAD],其中BUFFER_PAD占用128字节) 在其他issue 中,作者还针对数组的伪共享回复过: "It's used to pad the elements in the array away from the length parameter of the array. So that when the write to one of the array elements occurs it won't share a cache line with the length"。 这个我也没太懂,数组的length参数是什么?内存里有这个属性?数组的指针不就是直接指向数组的第一个元素吗?
    2022-07-27
    1
  • 残阳
    对于像vector 这样的局部变量,如何避免内存的频道申请与释放
    2023-11-14归属地:北京
  • Peter
    对于 C/C++ 语言来说,对一块内存进行修改时,使用 memcpy 操作性能则优于直接赋值操作 --> 老师,那struct 赋值来举例,可以直接使用=来赋值,而且不会赋值自动对齐的padding,是不是对于结构体来说直接=赋值效率会更高呢?
    2022-04-22
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部