while (true) 和 for (;;) 到底哪个更快?
作者 | RednaxelaFX
来源 | https://zhihu.com/question/52311366/answer/130090347
在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编译之类的就不用说了,输入都一样,输出也不会不同。
往期推荐
为什么不推荐使用 stop、suspend 方法中断线程?
阿里6000人发布联合倡议书:杜绝涉黄游戏和丑陋酒桌文化,HR不唯上、应更向人看!
阿里新瓜!又一个衣冠禽兽?
战争升级!Elasticsearch 从客户端向 AWS 开了一炮!
腾讯员工吐槽:团队来了个阿里高p,瞬间会议变多,群多了
喜欢本文欢迎转发,关注我订阅更多精彩
关注我回复「加群」,加入Spring技术交流群
while (true) 和 for (;;) 到底哪个更快?相关推荐
- getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快
在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . ...
- 64位和32位有什么区别?到底哪个更快?——硬核科普
原文链接:联想商用服务----64位和32位有什么区别?到底哪个更快?--硬核科普 32位和64位到底指什么? 下载 Windows 操作系统,会区分 X 64 和 X 86 版本(一般 X 86 是 ...
- 有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?
今日推荐 这 9 个 Java 开源项目 yyds,你知道几个?阿里技术专家推荐的20本书,免费送!K8S 部署 SpringBoot 项目(一篇够用)妙用Java 8中的 Function接口 消灭 ...
- 合并HTTP请求 vs 并行HTTP请求,到底谁更快?
面试时,经常会问候选人一个问题:如何提高网页性能? 有些基础的人都会提到这么一条:减少/合并HTTP请求. 继续问:浏览器不是可以并行下载资源吗?将多个资源合并成一个资源,只使用一个HTTP请求下载, ...
- myisam和innodb到底谁更快
说一下个人理解: MyISAM只加载了索引数据进内存,加载的数据量少,所以在相同时间内加载进内存的的索引数据也就越多,使CPU在相同时间内查询出更多的索引数据,当然这些必须要在查询的数据量大的情况下才 ...
- MyBatis 与 Hibernate 到底哪个更快?
前言 由于编程思想与数据库的设计模式不同,生出了一些ORM框架. 核心都是将关系型数据库和数据转成对象型.当前流行的方案有Hibernate与myBatis. 两者各有优劣.竞争激烈,其中一个比较重要 ...
- C++,Java,Python,Fortran到底哪个更快?
在<C++的速度比Java快2.1%:来自计算100万以内质数的实验数据对比>这篇文中比较了C++和Java的速度,现在接着用同样的办法通过算1000000以内的质数来比较python和f ...
- 转载:JAVA获取时间戳,哪个更快
转载:http://hi.baidu.com/suofang/item/96629a060a44c119eafe38cc 目前获取毫秒值大概有下面三种方法 Java代码 //方法 一 Sys ...
- 【干货】python多进程和多线程谁更快
python多进程和多线程谁更快 python3.6 threading和multiprocessing 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为G ...
最新文章
- 开发中的几种加密算法的使用场景
- C# StatusStrip状态栏 例程
- 修改场景默认pawn的方法
- 这些是实际面试中遇到的面试题
- A. Regular Bracket Sequences
- 【算法】八大排序算法的时间复杂度 表格
- 阿里云宝塔Linux服务器管理面版初始化地址不能登入(原创)
- 何为仿射变换(Affine Transformation)
- Haar人脸检测:Haar特征 + Adaboost+ 级联分类器及改进
- 幂级数 | 函数项级数、函数展开成幂级数(泰勒展开+麦克劳林展开)
- 什么是长连接和短连接
- 小白入门python教程自学python
- 这些天学C++到学ROS,都感觉视频教程效果好些。效率也高些,相比于单自己看书而言。
- 41首送别诗词,首首经典,值得为孩子们收藏!
- 软件工程复习笔记——第六章 软件维护
- 实体链接在小布助手和OGraph的实践应用
- 微信小游戏实现语音识别(超详细)
- 【红队APT】钓鱼篇Office-CVE漏洞RLO隐藏压缩包释放免杀打包捆绑
- 2018西工大计算机学院学生会,风雨同舟,砥砺前行:计算机学院学生会全体会议暨主席团换届竞选答辩举行...
- 计算机和hdmi无法正常显示,Win7系统下电脑HDMI连接显示器字体显示虚不清楚如何解决...