实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针)

💡 原文中文,约12800字,阅读约需31分钟。
📝

内容提要

我们的新项目开发了一个全区全服交易行系统,支持高实时性搜索和推荐。为降低搜索开销,我们使用动态和静态索引,但订单变化导致索引刷新影响性能。我们实现了类似Rust的`std::rc::Rc`的非线程安全智能指针,减少CPU缓存失效,提升了10%-16%的性能。未来将继续优化其他模块以减少开销。

🎯

关键要点

  • 新项目开发了全区全服交易行系统,支持高实时性搜索和推荐。

  • 为降低搜索开销,使用动态和静态索引,但订单变化会影响索引刷新性能。

  • 实现了类似Rust的非线程安全智能指针,减少CPU缓存失效,提升了10%-16%的性能。

  • 采用BTree管理有序索引,提高缓存命中率,减少Cache失效带来的浪费。

  • 实现了引用计数型智能指针,优化了多种使用场景,支持自定义Allocator。

  • enable_shared_from_this的实现支持对象自动带share_from_this()接口。

  • 在单元测试中发现std::shared_ptr和boost::shared_ptr的行为差异,调整为更符合直觉的实现。

  • 提供了一键切换组件的能力,方便比较性能差异。

  • 对其他组件进行了适配,支持一键切换,提升整体性能。

  • 未来计划继续优化模块,减少不必要的内部开销。

🔎

延伸解读

性能提升的背景

在全区全服交易行系统中,订单变化频繁,导致索引刷新影响性能。通过实现非线程安全的智能指针,减少了CPU缓存失效,从而提升了10%-16%的性能。这一改进对于高实时性搜索和推荐系统尤为重要,能够有效降低搜索开销。

智能指针的设计考量

新实现的智能指针类似于Rust的`std::rc::Rc`,专注于单线程环境下的性能优化。通过直接在智能指针对象中存储原始指针,避免了额外的地址查询跳转,提高了访问效率。这种设计在高频率的索引变更场景中尤为有效。

与现有实现的比较

在单元测试中发现,`std::shared_ptr`和`boost::shared_ptr`在行为上存在差异。新实现的智能指针在设计上更符合直觉,尤其是在空指针的引用计数处理上,选择将其计数设为0,提升了使用的一致性和可预测性。

未来优化方向

未来计划继续优化其他模块,减少不必要的内部开销,尤其是在C++20协程支持的上下文中。这表明团队对性能的持续关注,未来可能会有更多针对智能指针的优化和适配,值得关注。

延伸问答

strong_rc_ptr的主要优势是什么?

strong_rc_ptr相比于std::shared_ptr,能够减少CPU缓存失效,提升10%-16%的性能。

如何实现strong_rc_ptr?

strong_rc_ptr通过存储引用计数和原始指针,优化了内存访问,支持多种构造场景和自定义Allocator。

在什么场景下使用strong_rc_ptr更合适?

在需要频繁变更索引且对性能要求高的场景下,使用strong_rc_ptr可以有效减少性能损耗。

strong_rc_ptr与std::shared_ptr有什么区别?

strong_rc_ptr在空指针引用计数上处理为0,而std::shared_ptr处理为1,且在性能和行为上更符合直觉。

如何在项目中切换到strong_rc_ptr?

项目中可以通过实现的traits接口一键切换到strong_rc_ptr,方便比较性能差异。

未来对strong_rc_ptr的优化计划是什么?

未来计划继续优化其他模块,减少不必要的内部开销,并逐渐将非线程安全模块替换为strong_rc_ptr。

🏷️

标签

➡️

继续阅读