简单读取一下系统时间,能有多大影响?

2019 年 4 月 22 日 余晟以为

Image by Monoar Rahman Rony from Pixabay

在IT行业有一些大神极人物,他们多半有一些妖娆的行为,平常人看起来是毫无逻辑的。

我的一个朋友就曾亲历过这样的事情。一段程序无论怎么优化响应速度也上不去了,满足不了业务需求,大家抓耳挠腮、一筹莫展,只好“斗胆”求教大神。大神仔细端详了半天代码,也没说出个所以然来。

大家正在失望,哀叹“不过如此”的时候,大神幽幽念了一句:把取系统时间的那行给注释掉看看。

什么?大家都以为听错了——取系统时间会影响性能?这不应该是一个很轻量很轻量的操作吗?再说,无数的书上都是这样获取系统时间的,难道还会有问题吗?

无论如何,姑且死马当成活马医,试试看吧。

注释掉这段代码再测试,性能瓶颈果真消除了……

实话说,我虽然很早听过这段经历,但那个朋友复述时,只是强调大神有多么多么强,到底当时是什么情况,其中是什么原理(大神说过,但他给忘了),他也没有说出个所以然来。

不过我想,大神一定不是单纯从写代码的角度来发现问题的,而是深入知道背后的实现原理。这方面的问题,我也确实知道一点。

起码,对Java语言来说,System.nanoTime()System.currentTimeMillis()确实是不一样的。而且两者的优劣不能一概而论,要依据操作系统的不同来做具体的分析和取舍。比如在Window上,System.currentTimeMillis()可能要比Linux上快200倍(2017年github上有人发了测试结果,引起了广泛的讨论);而在有些情况下,System.currentTimeMillis()是一定不要做的选择。

github上那篇引起广泛讨论的文章(片段)

为什么会这样?要说清楚它,需要知道系统里的时钟类型。一种是monotonic clock(单调时间),表示系统启动以来经历的时间,这个值只会单调增加;还有一种是wall clock,即挂钟时间,表示人看得懂的、有社会意义的时间,正常情况下它也是单调增加的,但如果遇到手动调整或者自动校准等情况,其取值是可能波动的。

所以如果你希望获得的是有文化意义的时间,应当调用System.currentTimeMillis()来获取,如果只是单纯计时,调用System.nanoTime()反而更快。

实际上,Oracle官方网站上已经有这个bug:JDK-8185891,因为System.currentTimeMillis()在Linux上,基于历史原因,其实现是调用的gettimeoftheday。这个问题会影响JDK 8、9、10,如果是时间敏感型应用,影响可能会很严重,尤其在用到了HPET(Hight Precision Event Timer)的系统上更是如此。

官网截图

如果你对这类问题有兴趣,光看编程语言的书恐怕还不够。因为在计算机的世界里,代码之下还有太多复杂的因素,涉及到计算机体系结构的部分,如果不了解,可能会面对某些问题束手无策。

如今极客时间推出了计算机组成原理的课程。老规矩,在我这露个脸。

下面是课程的介绍,如果你之前就希望了解组成原理,或者觉得大纲编排符合自己的要求,或者觉得作者讲的问题让你感兴趣,不妨考虑下——原价99元,目前优惠只要68元。




这门课的作者是徐文浩,一个目前正在创业的工程师。7岁开始接触代码,近30年的码龄,毕业于上海交通大学计算机系,在 Trilogy Software 写过各种大型企业软件,也曾任 MediaV 技术总监,从零开始搭建支撑每天百亿流量的广告算法系统,提升了十倍以上的广告收入和 ROI;2016年底进军人工智能领域,创办 BotHub.AI,成为唯一进入 F8 大会开发者代表的中国公司。


这门课是什么样的?


针对性的解决大家学习中的困难,徐文浩在专栏中结合自己多年硬件研究和软件开发经验,通过日常工作实际场景+硬件发展历史+软件开发案例,深入浅出的为你讲解计算机组成原理的核心知识,教你真正看懂、学会、记住,从源头理解软、硬件的共同之处,洞悉性能问题的本质,学以致用。


为了方便大家的学习,徐文浩老师特地整理了一份学习脑图,希望你对将要学习的内容有个总纲的了解,做到心中有数。



你能获得什么?


1、学以致用的计算机底层知识

专栏会以日常开发中的真实案例,帮你理解计算机的各个组件是怎么运作的,遇到问题的根源是什么,从知识→应用→知识,形成闭环,学以致用。

比如说,CPU里面的冒险和分支预测的策略,就好像在接力赛跑里面后面几棒的选手早点起跑,如果交接棒没有问题,自然占了便宜,但是如果没能交接上,就会吃个大亏。

2、30+计算机组成原理核心要点

作者会把整个的计算机组成原理通过指令、计算、CPU、存储系统和IO串起来,以一个程序的执行过程进行逐层分解,从历史视角讲清楚“是什么”,结合案例讲清楚“怎么做”,带你搞懂计算机组成原理中最核心、最重要的内容。

3、洞悉性能问题的本质

学习计算机组成原理,其实就是理解计算机是怎么运作的,以及为什么这么运作。在此基础上,我们才能又快又准地优化性能,提升效率。而我们想要解决性能问题,其实就是在此基础上,去关注时钟周期时间、每条指令的平均时钟周期数CPI、指令数。

4、组成原理在工业界的实际应用

理解了计算机各个组件的运作之后,还将手把手带你实操。利用存储器层次结构设计大型 DMP 系统,并通过 Disruptor,跟你一起感受 CPU 的风驰电掣,让你真正学有所用。

“练拳不练功,到老一场空”。做一个真正的工程师,越早弄清楚计算机的底层原理,在你的知识体系中“储蓄”起这些知识,也就意味着你有越长的时间来收获学习知识的“利息”。长久的“复利效应”,会让你的未来走的更远更轻松。


△扫码免费试读或订阅


现在订阅有什么福利?


1、限时优惠 ¥68(原价 ¥99),2 杯咖啡的价格,助你打好这门“硬核内功”。

2、订阅专栏后,在留言区里聊聊「你对计算机组成原理是如何认识的?在工作中有什么应用?」,点赞第1名,可获得极客时间99元任意课程,我将自费送出,活动截止 4月 25 日 24:00。

3、今日订阅,可加入「计算机组成原理学习小组」,仅限前500人,还可免费领取2019极客时间50G程序员进阶资料包,在公众号后台对话框,回复【计算机】领取!



专栏详细目录


成功不等于加班,奋斗也不等于996,关键在于你能解决了别人不能解决的问题。勤修“内功”,才能走的更加长远。

点击「阅读原文」,一起打通计算机学习的“任督二脉”!

登录查看更多
0

相关内容

【硬核书】群论,Group Theory,135页pdf
专知会员服务
121+阅读 · 2020年6月25日
【高能所】如何做好⼀份学术报告& 简单介绍LaTeX 的使用
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【ACL2020-Google】逆向工程配置的神经文本生成模型
专知会员服务
16+阅读 · 2020年4月20日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
34+阅读 · 2020年4月5日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
缺失数据统计分析,第三版,462页pdf
专知会员服务
105+阅读 · 2020年2月28日
社区分享|如何让模型在生产环境上推理得更快
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
可能是讲分布式系统最到位的一篇文章
InfoQ
8+阅读 · 2018年11月19日
刚开始学编程?这几款小工具能让你事半功倍
已删除
生物探索
3+阅读 · 2018年2月10日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
简单车牌检测
计算机视觉战队
6+阅读 · 2017年6月23日
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Arxiv
3+阅读 · 2018年4月9日
Arxiv
7+阅读 · 2018年3月22日
Arxiv
5+阅读 · 2015年9月14日
VIP会员
相关VIP内容
【硬核书】群论,Group Theory,135页pdf
专知会员服务
121+阅读 · 2020年6月25日
【高能所】如何做好⼀份学术报告& 简单介绍LaTeX 的使用
【实用书】流数据处理,Streaming Data,219页pdf
专知会员服务
76+阅读 · 2020年4月24日
【ACL2020-Google】逆向工程配置的神经文本生成模型
专知会员服务
16+阅读 · 2020年4月20日
【WWW2020-微软】理解用户行为用于文档推荐
专知会员服务
34+阅读 · 2020年4月5日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
《代码整洁之道》:5大基本要点
专知会员服务
49+阅读 · 2020年3月3日
缺失数据统计分析,第三版,462页pdf
专知会员服务
105+阅读 · 2020年2月28日
相关资讯
社区分享|如何让模型在生产环境上推理得更快
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
说说我的老同事,前端大神程劭非
余晟以为
17+阅读 · 2019年1月14日
可能是讲分布式系统最到位的一篇文章
InfoQ
8+阅读 · 2018年11月19日
刚开始学编程?这几款小工具能让你事半功倍
已删除
生物探索
3+阅读 · 2018年2月10日
十五条有用的Golang编程经验
CSDN大数据
5+阅读 · 2017年8月7日
简单车牌检测
计算机视觉战队
6+阅读 · 2017年6月23日
相关论文
Do RNN and LSTM have Long Memory?
Arxiv
19+阅读 · 2020年6月10日
Arxiv
3+阅读 · 2018年4月9日
Arxiv
7+阅读 · 2018年3月22日
Arxiv
5+阅读 · 2015年9月14日
Top
微信扫码咨询专知VIP会员