-
Notifications
You must be signed in to change notification settings - Fork 29
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
defer 的性能似乎没有想象中的差 #6
Comments
理解gap而已,每个操作耗时都不一样,不是说增加defer会导致20倍性能损耗 fmt.Sprintf或者fmt.Sprint在场景下不一定省的了的,提供interface{}类型的key性能会有下降 |
已经提交代码,在跑bench了 : ) |
我试了下,空函数也是差不多的,可能是 Go 对 defer 做了优化吧
跑出来的结果是:
PS: 我不是说要提供 interface{} 的 key 哈,使用 string 本身没有啥问题,我是想说其实用户创建这个 key 的时候不用 fmt,而是直接拼接,省出来的性能可能远比库本身的性能要多 : ) PPS: 老哥,我非常赞同您的 “暴力美学”,毕竟 “完美的软件不是不能再加东西,而是不能再减任何东西”,所以我也一直在做减法,给 ecache 点个 star,做开源不容易,向你学习!(另外,毛老师真的是个老司机😏) |
ok,我调整一下readme,上面的优化从bench上看效果不大,数字也比较小,实际如果是uid之类的话,效果会有一些吧 你指的拼接具体是怎样的? 感谢建议~发完v1.1.0暂时不搞了,另一个存储项目耽搁好久了😅 |
我优化完了写bench时候有看到 本来打算在 |
拼接就是用 + 连接字符串哈哈,比如说这两种写法:
用户想要性能的话,还是会选择用 + 拼接的,虽然可读性看起来没有 fmt 高 : ) PS: 我对存储软件也挺感兴趣的,一直想研究下,不耽搁您这边写存储项目了😅 |
+会有临时对象产生,如果有格式化需求,用fmt.Sprintf感觉更合适,没仔细测试过,我在borm里面用的是StringBuffer,那个就太难看了,只能库里面用 啊,不是那个意思,不是说issue耽误我哈,只是感觉自己在优化上花的时间太久了,没符合预期,终于可以结束了 很可惜, |
我之前有测试过 + 拼接、Builder 以及 Buffer 的性能,在拼接数量多的时候确实 + 的性能差很多,但是在连接数量少的时候差别不大,而缓存 key 一般也就连接两三个字符串,所以用 + 也还好。倒是 fmt 性能消耗挺大的,毕竟用了反射操作。。。 话说回来,相比网络操作,这些都是小儿科哈哈 之前我优化一个日志库的时候就发现时间操作很耗时,当时用了类似缓存的方式去优化,结果性能测试惨不忍睹。。。负优化的一大惨案 😅 PS: 期待大佬的其他开源杰作! |
嗯,对的,之前在业务代码里面用fmt比较省事儿,周末看了strconv.FormatInt性能好很多。上周改用shim的方案,还多一次bytes转string,gc性能没法和freecache这种直接存bytes的PK,换成strconv.FormatInt好多了,目前是不同的库都用了更合适的方案。 |
我看到文档中写用 defer 相差 20 倍性能,于是就做了个性能测试,看起来差距并不大 : )
以下是测试用例:
或许您也可以试试,看看 defer 的性能是否真的这么差 ~
PS: 其实内存操作本身就很快,如果追求极致性能,与其纠结 defer,倒不如放弃 fmt.Sprintf 😄
PPS: 这个获取时间的优化属实有点骚~
The text was updated successfully, but these errors were encountered: