没有合适的资源?快使用搜索试试~ 我知道了~
发现一个开源项目优化点,点进来就是你的了.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 46 浏览量
2022-07-08
16:40:35
上传
评论
收藏 3.14MB DOC 举报
温馨提示
试读
16页
发现一个开源项目优化点,点进来就是你的了.doc
资源推荐
资源详情
资源评论
发现一个开源项目优化点,点进来就是你的了
hello,大家好呀,我是小楼。
最近无聊(摸)闲逛(鱼)时,发现了一个阿里开源项目可以贡献代码的地方。
不是写单测、改代码格式那种,而是比较有挑战的性能优化,最关键的是还不难,仔细看
完本文后,有点基础就能写出来的那种,话不多说,发车!
相信大家在日常写代码获取时间戳时,会写出如下代码:
long ts = System.currentTimeMillis();
读者中还有一些 Gopher,我们用 Go 也写一遍:
UnixTimeUnitOffset = uint64(time.Millisecond / time.Nanosecond)
ts := uint64(time.Now().UnixNano()) / UnixTimeUnitOffset
在一般情况下这么写,或者说在 99%的情况下这么写一点问题都没有,但有位大佬研究
了 Java 下时间戳的获取:
http://pzemtsov..io/2017/07/23/the-slow-currenttimemillis.html
他得出了一个结论:并发越高,获取时间戳越慢!
具体到细节咱也不是很懂,大概原因是由于只有一个全局时钟源,高并发或频繁访问会造
成严重的争用。
缓存时间戳
我最早接触到用缓存时间戳的方式来优化是在 Cobar 这个项目中:
https://.com/alibaba/cobar
由于 Cobar 是一款数据库中间件,它的 QPS 可能会非常高,所以才有了这个优化,我们
瞅一眼他的实现:
起一个单独的线程每隔 20ms 获取一次时间戳并缓存起来
使用时间戳时直接取缓存
https://.com/alibaba/cobar/blob/master/server/src/main/server/com/alibaba/cobar/util/TimeUtil.jav
a
/**
* 弱精度的计时器,考虑性能不使用同步策略。
*
* @author xianmao.hexm 2011-1-18 下午 06:10:55
*/
public class TimeUtil {
private static long CURRENT_TIME = System.currentTimeMillis();
public static final long currentTimeMillis() {
return CURRENT_TIME;
}
public static final void update() {
CURRENT_TIME = System.currentTimeMillis();
}
}
https://.com/alibaba/cobar/blob/master/server/src/main/server/com/alibaba/cobar/CobarServer.java
timer.schedule(updateTime(), 0L, TIME_UPDATE_PERIOD); // TIME_UPDATE_PERIOD
是 20ms
...
// 系统时间定时更新任务
private TimerTask updateTime() {
return new TimerTask() {
@Override
public void run() {
TimeUtil.update();
}
};
}
Cobar 之所以这么干,一是因为往往他的 QPS 非常高,这样可以减少获取时间戳的 CPU
消耗或者耗时;其次是这个时间戳在 Cobar 内部只做统计使用,就算不准确也并无大碍,从
实现上看也确实是弱精度。
后来我也在其他的代码中看到了类似的实现,比如 Sentinel(不是 Redis 的 Sentinel,而是
阿里开源的限流熔断利器 Sentinel)。
Sentinel 作为一款限流熔断的工具,自然是自身的开销越小越好,于是同样都是出自阿里
的 Sentinel 也用了和 Cobar 类似的实现:缓存时间戳。
原因也很简单,尽可能减少对系统资源的消耗,获取时间戳的性能要更优秀,但又不能和
Cobar 那样搞个弱精度的时间戳,因为 Sentinel 获取到的时间戳很可能就决定了一次请求是
否被限流、熔断。
所以解决办法也很简单,直接将缓存时间戳的间隔改成 1 毫秒
去年我还写过一篇文章《低开销获取时间戳》,里面有 Sentinel 这段代码:
剩余15页未读,继续阅读
资源评论
书博教育
- 粉丝: 1
- 资源: 2835
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- pcb原理图.PcbDoc
- 计算机视觉-人脸识别-开发包-商业应用-人脸识别开发包(免费,可商用,有演示、范例、说明书)完整项目实例源码.zip
- Libraries-Comm-Controller
- 豆瓣电影爬虫 爬取top电影的评论 + 每个用户的看过的电影的评论 用于推荐系统的 协同过滤+源代码+文档说明
- 交互设计课程竞品分析内容案例设计
- c07c4b30caf2ab290c3f2eea8339b34b.mp4
- emqx服务器搭建文件
- Libraries-Comm-Controller-DOC-V2-0-1-en.pdf
- update9-20240601.5.205.slice.img.7z.003
- 9f9ae03ea06c5c991afa26c5813d8831.amr
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功