本文记录了ecache
v1.0.5到v1.1.0的性能优化过程
背景介绍
ecache
是一款极简设计、高性能、并发安全、支持分布式一致性的轻量级内存缓存,支持LRU和LRU-2两种模式项目地址:https://github.com/orca-zhang/ecache
准备工作
原则
基于真实的度量。——《重构——改善现有代码的设计》P69
哪怕你完全了解系统,也请实际度量它的性能,不要臆测。臆测会让你学到一些东西,但十有八九你是错的。
思路
我期望能够有一个仓库,每次优化以后,都能横向比较同类库之间的性能,并且通过直观的柱状图之类的图表展示出来,于是有了benchplus/gocache项目,它是一个持续基准测试的项目。
第一版我设计了写入和读取整型、写入1K/1M数据、写入小对象(
bigcache
和freecache
需要序列化)、写满以后继续写入整型等用例。第二版又增加了并发读写、GC耗时、命中率、内存占用等用例。
工具
golang pprof
graphivs(用来生成剖析结果图片)
mac下安装命令:
brew install graphviz
步骤
运行一次ecache的测试用例
sh>
GO111MOUDLE=off go test -bench=BenchmarkGetInt_ecache ecache_test.go -cpuprofile=cpu.prof
剖析结果文件
sh>
go tool pprof benchplus.test cpu.prof
交互模式下:(pprof) svg
分析生成的svg图
优化一:读取性能(从100ns/op到40ns/op)
总体还是比较符合预期的,毕竟在性能方面已经有所考量和侧重,但是在最初的测试中,优势依然不是特别明显,比如读取性能,最快的
bigcache
读取整型值的性能在 80ns/op 左右,但是ecache
在第一版只能跑出 100ns/op 左右的性能。
hashCode
占了总耗时的50%
![3a52b1b82365680262ed7a695d053162.png](https://i-blog.csdnimg.cn/blog_migrate/b3692d96aee27bbc599a7adb4456743c.png)
分析剖析结果,发现大部分时间花在了
string
转[]byte
产生临时对象的产生和销毁上优化思路:换一种hash方法,按照以前的经验,BKRD和AP的分布性比较好,BKRD实现更简单,性能也不错,所以选择BKRD替代CRC32【commit-0e7aaaae】
<