for (;;) 与 while (true),哪个更快?
在 JDK8u 的 jdk 项目下做个很粗略的搜索:
mymbp:/Users/me/workspace/jdk8u/jdk/src
$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l369
mymbp:/Users/me/workspace/jdk8u/jdk/src
$ egrep -nr "while \\(true" . | wc -l323
while (1) {/* ... */}
但不是所有人都喜欢看到那个魔数“1”的。而用for (;;)来表达不写循环条件(也就是循环体内不用break或goto就会是无限循环)则非常直观,这就是for语句本身的功能,而且不需要写任何魔数。
所以,这个写法就流传下来了。
顺带一提,在Java里我是倾向于写while (true)的,不过我也不介意别人在他们自己的项目里写for (;;)。
至于Java里的for (;;)与while (true),哪个更快?
这种规范没有规定的问题,答案都是“看实现”,毕竟实现只要保证语义符合规范就行了,而效率并不在规范管得着的范畴内。
以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面俩语句的编译结果:
public void foo() {int i = 0;while (true) { i++; }}/*public void foo();Code:stack=1, locals=2, args_size=10: iconst_01: istore_12: iinc 1, 15: goto 2
*/
与
public void bar() {int i = 0;for (;;) { i++; }}/*public void bar();Code:stack=1, locals=2, args_size=10: iconst_01: istore_12: iinc 1, 15: goto 2
*/
连javac这种几乎什么优化都不做(只做了Java语言规范规定一定要做的常量折叠,和非常少量别的优化)的编译器,对上面俩版本的代码都生成了一样的字节码。
后面到解释执行、JIT编译之类的就不用说了,输入都一样,输出也不会不同。
作者:RednaxelaFX
来源:zhihu.com/question/52311366/answer/130090347
for (;;) 与 while (true),哪个更快?相关推荐
- 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?
转自:知乎 www.zhihu.com/question/52311366/answer/1300903 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/work ...
- while (true) 和 for (;;) 到底哪个更快?
作者 | RednaxelaFX 来源 | https://zhihu.com/question/52311366/answer/130090347 在JDK8u的jdk项目下做个很粗略的搜索: my ...
- bool在哪个头文件_Java里的 for (;;) 与 while (true),哪个更快?
点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人! 本文来自: https://www.zhihu.com/question/523113 ...
- 琢磨琢磨,while (true) 和 for (;;) 哪个更快?!
在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\s?;&q ...
- 有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?
今日推荐 这 9 个 Java 开源项目 yyds,你知道几个?阿里技术专家推荐的20本书,免费送!K8S 部署 SpringBoot 项目(一篇够用)妙用Java 8中的 Function接口 消灭 ...
- getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快
在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . ...
- Java里的 for (;;) 与 while (true),哪个更快?
在JDK8u的jdk项目下做个很粗略的搜索: 并没有差多少. 其次,for (;;) 在Java中的来源.个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响.这些人不一定是自己以前写C习 ...
- 使用Python,dlib中新型、更快、更小的5点面部标志检测器检测人脸、眼睛、鼻子
这篇博客将介绍一个新的dlib面部标志检测器--5点人脸标志模型,它比原始版本更快(提高了8-10%),效率更高,模型更小(降低了10倍). 该5点面部标志检测器被认为是最初随dlib库一起分发的68 ...
- Google 开源的依赖注入库,比 Spring 更小更快!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:GinoBeFunny zhuanlan.zhihu.com ...
- 让 Spring Boot 启动更快一点
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 "Spring有多快?" 这是 2018 Sp ...
最新文章
- J. Cheminform. | 基于化学基因组学中深度和浅层学习预测药物特异性
- OpenCV参考手册之Mat类详解1
- LeetCode-字符串-反转字符串中的单词 II
- Java中最早期的集合Vector
- CentOS 7.6 下安装 MySQL8.0.13
- wstring和string简单正则表达式使用
- JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理
- 常用的DOS功能输入输出
- css 固定宽度,自动换行
- OD数据集(一)—介绍
- 读书笔记——《灰度决策:如何处理复杂、棘手、高风险的难题》
- Glusterfs stripe卷挂载失败问题-客服端挂载提示:Mounting glusterfs on /test0 failed.
- 跨考西北工业大学计算机专硕,西工大计算机专硕400+上岸学长经验分享
- RN 调用原生WebPage 解决微信支付Referer问题
- springmvc对json数据的处理
- linux 锁定用户目录,Linux vfpd锁定用户目录
- 文件未上传成功再次点击上传报错问题处理
- 淘宝网及新浪网等几大官方IP查询API接口地址库的调用及使用方法教程
- Win10彻底关闭实时保护
- 毕业回忆我的大学(2)——上课、考试