如何一步步提升Go内存缓存性能

本文详述了从v1.0.5到v1.1.0的Go内存缓存性能提升过程,包括读取性能从100ns/op优化到40ns/op,以及减少GC耗时的策略。通过优化读取策略、减少临时对象和改进双链表结构,实现了性能的显著提升。此外,还解决了时间戳问题和并发安全性问题。
摘要由CSDN通过智能技术生成

本文记录了ecache v1.0.5到v1.1.0的性能优化过程

背景介绍

  • ecache是一款极简设计、高性能、并发安全、支持分布式一致性的轻量级内存缓存,支持LRU和LRU-2两种模式

  • 项目地址:https://github.com/orca-zhang/ecache

准备工作

原则

  • 基于真实的度量。——《重构——改善现有代码的设计》P69

哪怕你完全了解系统,也请实际度量它的性能,不要臆测。臆测会让你学到一些东西,但十有八九你是错的。

思路

  • 我期望能够有一个仓库,每次优化以后,都能横向比较同类库之间的性能,并且通过直观的柱状图之类的图表展示出来,于是有了benchplus/gocache项目,它是一个持续基准测试的项目。

  • 第一版我设计了写入和读取整型、写入1K/1M数据、写入小对象(bigcachefreecache需要序列化)、写满以后继续写入整型等用例。第二版又增加了并发读写、GC耗时、命中率、内存占用等用例。

工具

  • golang pprof

  • graphivs(用来生成剖析结果图片)

    • mac下安装命令:brew install graphviz

步骤

  1. 运行一次ecache的测试用例

    sh> GO111MOUDLE=off go test -bench=BenchmarkGetInt_ecache ecache_test.go -cpuprofile=cpu.prof

  2. 剖析结果文件

    sh> go tool pprof benchplus.test cpu.prof
    交互模式下:(pprof) svg

  3. 分析生成的svg图

优化一:读取性能(从100ns/op到40ns/op)

  • 总体还是比较符合预期的,毕竟在性能方面已经有所考量和侧重,但是在最初的测试中,优势依然不是特别明显,比如读取性能,最快的bigcache读取整型值的性能在 80ns/op 左右,但是ecache在第一版只能跑出 100ns/op 左右的性能。

hashCode占了总耗时的50%

3a52b1b82365680262ed7a695d053162.png
  • 分析剖析结果,发现大部分时间花在了string[]byte产生临时对象的产生和销毁上

  • 优化思路:换一种hash方法,按照以前的经验,BKRD和AP的分布性比较好,BKRD实现更简单,性能也不错,所以选择BKRD替代CRC32【commit-0e7aaaae】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值