通过减少内存使用改善.NET性能
极客时间编辑部
讲述:杜力大小:1.09M时长:02:22
当.NET 刚出现的时候,许多人抱怨.NET 垃圾回收器的不确定性表现将会损害性能并且难以解释。当时微软的反驳是,对于大多数用例来说,尽管间歇的 GC 会暂停,但“标记 - 清扫”的垃圾回收器实际上会更快。
不幸的是,随着时间的推移,这个信息变得有些混乱。即使开发者接受这样一种理论,即“标记 - 清扫”的垃圾回收器速度比引用计数更快,但这并不意味着它在绝对意义上是必须的。内存分配和相关的内存压力通常是很难检测性能问题的原因。
而且,使用的内存越多,CPU 缓存的效率就越低。虽然主 RAM 很大,以至于在大多数用例中几乎都不会使用到基于磁盘的虚拟内存,但是相比之下,CPU 中的缓存是很小的。从 RAM 中填充 CPU 缓存所需的时间可能会占用数十甚至数百个 CPU 周期。
在最近的一篇文章中,弗朗斯·布马(Frans Bouma)确定了几种优化内存使用的技术。虽然他着重关注改善 ORM 性能,但这些建议在各种情况下都很有用。他的这些建议包括:
1. 避免参数数组
参数关键字是有用处的,但与普通的函数调用相比要昂贵,因为它需要内存分配。API 应该为常用的参数计算提供无参数重载。还应该提供一个 IEnumerable < T > 或者 IList< T > 的重载,这样集合在调用函数之前就不需要多此一举的被复制到一个数组中了。
2. 如果定义之后立即添加数据,可先预定义数据结构的大小
List< T > 或其他集合类可以在被填充时多次调整大小。每次调整大小的操作都会分配另一个内部数组,并由前一个数组填充。开发者可以通过为集合的构造函数提供一个容量参数来避免这种开销。
3. 惰性的初始化成员
如果开发者知道一个给定对象在大多数情况下是不需要的,那么就应该使用延迟初始化来避免过早地分配内存给它。通常这是手动完成的,因为 Lazy< T > 类本身需要分配内存。
早在 2011 年,曾经有报道说明微软试图通过使用类似技术来减少任务的规模。他们的报告显示,在创建一个 < int32 > 任务的时候花费的时间减少了 49% 到 55%,所需空间大小减少了 52%。感兴趣的读者可以点击相关页面进行查看。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
精选留言
由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论