琢磨琢磨,while (true) 和 for (;;) 哪个更快?!
在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
并没有差多少。
其次,for (;;) 在Java中的来源。个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响。这些人不一定是自己以前写C习惯了这样写,而可能是间接受以前写C的老师、前辈的影响而习惯这样写的。
在C语言里,如果不include某些头文件或者自己声明的话,是没有内建的Bool / bool类型,也没有TRUE / FALSE / true / false这些Bool / bool类型值的字面量的。所以,假定没有include那些头文件或者自己define出上述字面量,一个不把循环条件写在while (...)括号里的while语句,最常见的是这样:
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编译之类的就不用说了,输入都一样,输出也不会不同。
琢磨琢磨,while (true) 和 for (;;) 哪个更快?!相关推荐
- 有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?
今日推荐 这 9 个 Java 开源项目 yyds,你知道几个?阿里技术专家推荐的20本书,免费送!K8S 部署 SpringBoot 项目(一篇够用)妙用Java 8中的 Function接口 消灭 ...
- 快手二面: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 ...
- 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习 ...
- 刘强东:猪飞到天疯狂了十几秒 但摔下死得更快
刘强东:猪飞到天疯狂了十几秒 但摔下死得更快 2015年09月22日09:47 新浪科技 我有话说(6,450人参与) 收藏本文 查看最新行情 京东CEO刘强东 新浪科技讯 ...
- 总结 10 年前端经验,谈谈前端人如何更快地成长
常言道:三十年河东.三十年河西.这句话放到前端领域,就要变成 "十年河东.十年河西",甚至每隔三五年,前端行业的技术格局就会大面积翻新.对于资深的前端开发者来说,已经适应了这种更新 ...
- msdn安装后怎么用_Win10不好用?安装官方版精简Win10后,运行比win7更快更流畅
尽管不想承认,确实是大白菜的电脑配置有点旧了,导致从win7升级最新版win10系统后,电脑是100个不好用!!! 虽然,非常怀念使用win7系统时,那种操作的流畅度,那种运行的速度~ 但是,大白菜和 ...
最新文章
- ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course
- java 生成parquet文件格式,使用Java API将Parquet格式写入HDFS,而不使用Avro和MR
- samba服务的搭建
- 北交专升本计算机联锁考试题,北交《计算机联锁技术》在线作业一15春满分答案...
- [笔记]极大极小过程的alpha-beta剪枝不可与记忆化搜索一起使用
- 大数据学习笔记27:MR案例——多输入源处理成绩
- 5个元素排序java_Android-java-如何按对象内的某个值对对象列表进行排序
- 专科计算机组成原理大一试题及答案,计算机组成原理专科试题答案.doc
- java的核心类库_Java核心类库
- 本地与服务器文件同步软件哪个好,同步软件哪个好,亲身体验的3款免费同步软件介绍...
- PDF编辑软件如何编辑PDF文件
- 【运筹学】线性规划 单纯形法原理 ( 构造初始可行基 | 基变换 | 最优性检验 | 解的判别 | 检验数 | ( 唯一 / 无穷多 ) 最优解判别定理 | 无界解判别定理 )
- win10黑科技,新建桌面非常好用
- 一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤
- Nginx教程(二) Nginx虚拟主机配置
- DNS劫持,HTTP劫持、HTTPS劫持【流量劫持】
- 4G物联网卡的几点优势
- 《白话统计》笔记之正态性与方差齐性
- sin72度用计算机怎么算,三角函数值
- egg支持路径别名@