For与while时间的对比

2023-11-03

    本文首发于cartoon的博客
    转载请注明出处:https://cartoonyu.github.io/cartoon-blog/post/java/for%E4%B8%8Ewhile%E6%97%B6%E9%97%B4%E7%9A%84%E5%AF%B9%E6%AF%94/

    相关文章:JAVA遍历机制的性能的比较

前言

索引随机访问数组相信是很常见的操作.

但是昨天在做leetcode的Reverse String时,发现了很奇怪的现象,具体如下图

for与while时间对比图

当时我也觉得不可思议,怎么快了那么多,所以今天复盘一下。

正文

注:这篇文章只涉及原始数组的索引遍历,不涉及包装数据结构以及foreach

测试代码
  • for
private static void textFor(){
        int[] data=new int[1000];
        int i=0;
        for(;i<1000;i++){
            data[i]=i;
        }
        i=0;
        long start=System.currentTimeMillis();
        for(;i<1000;i++){
            System.out.print(data[i]+" ");
        }
        long end=System.currentTimeMillis();
        System.out.println();
        System.out.println("for use:"+(end-start)+"ms");
    }
  • while
private static void textWhile(){
        int[] data=new int[1000];
        int i=0;
        for(;i<1000;i++){
            data[i]=i;
        }
        i=0;
        long start=System.currentTimeMillis();
        while(i<1000){
            System.out.print(data[i++]+" ");
        }
        long end=System.currentTimeMillis();
        System.out.println();
        System.out.println("while use:"+(end-start)+"ms");
    }
结果
for use:35ms
while use:15ms

for use:14ms
while use:6ms

for use:14ms
while use:8ms

for use:20ms
while use:5ms

所用时间可能不一样,但是大概比例应该跟我的差不多

有点意外的是,while比for竟然要少一倍(大概)的时间,颠覆了我之前的认知。

结果分析

虽然我没有debug代码,但是我猜测是循环执行语句的多少差别。

for中,执行顺序是

  • 判断循环变量是否越界
  • 执行打印语句
  • 循环变量自增

while中,执行顺序是

  • 判断循环变量是否越界
  • 执行打印语句,循环变量自增

与for相比,while所执行的语句量少掉1/3,所以我觉得这就是原因。(如果有更好的原因可以评论或者发起Issue)

后话

生命不息,技术不止。

很多时候我也为了代码量的减少不理会运行时间的差异,这次吸收教训,之后在实际开发会更加注意时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

For与while时间的对比 的相关文章

随机推荐

  • Umi + Dva (model数据使用教程demo)

    React 不多说 3大框架之一 Dva 是由阿里架构师 sorrycc 带领 team 完成的一套前端框架 在作者的 github 里是这么描述它的 dva 是 react 和 redux 的最佳实践 现在已经有了自己的官网 https
  • PostgreSQL备份与还原指定数据库数据和导出指定的数据表

    PostgreSQL备份与还原指定数据库数据 PostgreSQL备份与还原指定数据库数据 备份 pg dump 还原 psql Postgresql导出指定的数据表 PostgreSQL备份与还原指定数据库数据 备份 pg dump pg
  • vue获取当前时间并时时刷新

    vue获取当前时间并时时刷新 页面显示 div span nowDate span span class houertime hourDate span div 图片上传失败 我是分开年月日和时分秒 给时分秒加样式 2022 11 24 1
  • [windows优化]win10折腾过程

    2018 11 27更新 没固态硬盘 拯救者还不值3000 非常卡 双十一 终于忍不住买了块固态硬盘 刚好最近技术发展 固态硬盘降价了 入手三星750 M 2 250G 如果机子不能识别固态硬盘 请进入BIOS 设置启动模式为UEFI 进入
  • CPU眼里的: MMU

    一 MMU与空间独立性 内存管理单元 memory management unit P1P2为两个进程 它们之间存在空间独立性 p1与p2的a虽然同一虚拟内存 但经过MMU会映射在物理内存的不同地址 真正的物理内存空间就是天空 每个进程就是
  • adas记录仪app_4K旗舰丨盯盯拍MINI5智能行车记录仪荣耀新生!

    2020年5月19日 盯盯拍MINI5 4K旗舰行车记录仪正式发布 本次新品不仅在影像上实现再一次突破 在传输 存储及远程互联等功能上 也有更多创新升级 同时 盯盯拍MINI5作为畅连通话及AR导航视觉终端 也在最新的荣耀智慧生活新品发布会
  • 相机姿态估计

    目录 一 相机姿态估计原理 二 相机姿态估计实现 一 相机姿态估计原理 首先介绍一下什么是世界坐标系和相机坐标系 世界坐标系是自己定义的一个坐标系 这里我定义世界坐标系是X轴垂直屏幕指向人 Y轴水平向右 Z轴竖直向上 相机坐标系有统一的规定
  • 用matlab绘制幂函数

    用matlab绘制幂函数 下周轮到我做论文汇报了 刚好前两天看了网格水印的文章 就决定汇报前两天看到的那篇论文了 在准备ppt的过程中 绘制了一些幂函数 感觉matlab真的是很强大啊 可以绘制各种曲线 下面就简要介绍一下如何用matlab
  • Python错误笔记:NameError: name 'M' is not defined

    1 在使用name input 时报 NameError name M is not defined的错误 解决方式 使用raw input 代替input 资料 https blog csdn net dq dm article deta
  • iOS protobuf3.1.0使用

    Protobuf简介 Protocol Buffer是google 的一种数据交换的格式 已经在Github开源 目前最新版本是3 1 0 它独立于语言 独立于平台 google 提供了多种语言的实现 Java C C Go 和 Pytho
  • java ResultSet获得总行数

    在Java中 获得ResultSet的总行数的方法有以下几种 第一种 利用ResultSet的getRow方法来获得ResultSet的总行数 Statement stmt con createStatement ResultSet TYP
  • 扩散模型实战(一):基本原理介绍

    扩散模型 Diffusion Model 是 类 分先进的基于物理热 学中的扩散思想的深度学习 成模型 主要包括前向扩散和反向扩散两个过程 成模型除了扩散模型之外 还有出现较早的VAE Variational Auto Encoder 变分
  • pandas入门:导出数据的四种方式

    pandas导出数据到文件的四种方式 import pandas as pd import pymysql df pd DataFrame A 3 4 8 9 B 1 2 2 4 4 5 7 3 C aa bb cc dd def expo
  • MATLAB经典代码实现---LASSO和Elastic net

    作为正则化约束或者变量稀疏筛选相关领域的经典分析方法 最小绝对收缩和选择方法 Least Absolute Shrinkage and Selection Operator LASSO 和弹性网络 Elastic net 已被广泛应用到各行
  • 文件上传漏洞进阶教程/白名单绕过/图片马制作/图片马执行

    一 白名单绕过 相对于前面的黑名单绕过 白名单更加难以绕过 使用白名单验证相对比较安全 但如果存在可控参数目录 也存在被绕过的风险 目录可控 00截断绕过上传 upload lab pass11 源码分析 is upload false m
  • Java多线程(附代码示例)

    1 一些概念 线程就是独立的执行路径 在程序运行时 即使没有自己创建线程 后台也会有多个线程 如主线程 gc线程 main 称之为主线程 是系统的入口 用于执行整个程序 在一个进程中 如果开辟了多个线程 线程的运行由调度器安排调度 调度器是
  • 数据处理时如何解决噪声数据?

    一 什么是噪声 在机器学习中我们在独立随机抽样的时候会出现一些搞错的信息 这些错误的数据我们称之为杂讯 或者噪音 noise 一般可以归结为一下两种 以二分为例 输出错误 1 同样的一笔数据会出现两种不同的评判 2 在同样的评判下会有不同的
  • WINXP优化详解

    WinXP的启动会有许多影响速度的功能 尽管ms说已经作最优化处理过 但对我们来说还是有许多可定制之处 我一般是这样来做的 1 修改注册表的run键 取消那几个不常用的东西 比如Windows Messenger 启用注册表管理器 开始 运
  • 问题解决:windows未能启动,原因可能是最近更改了硬件或软件

    开机出现如下画面 电脑原先是win7旗舰版 没用几天 不知道怎么出现了这样的问题 网上查了很多 也用了几种方法 有些方法不知道是不是不行 总之没有解决我这里的问题 最终我用下面的方法解决了这个问题 解决方法 以下是重装系统的过程 1 首先制
  • For与while时间的对比

    本文首发于cartoon的博客 转载请注明出处 https cartoonyu github io cartoon blog post java for E4 B8 8Ewhile E6 97 B6 E9 97 B4 E7 9A 84 E5