`
xuela_net
  • 浏览: 494495 次
文章分类
社区版块
存档分类
最新评论

深度比较Java循环的性能

 
阅读更多

Java语言中,常用的循环语句有4种。这些循环是编写Java代码必然会涉及到的控制流语句,片段代码如下。

1.For each 语句

这个循环式在Java5中引进的,优点是很简洁。

private List<Integer> list = new ArrayList<>();
for(Integer i : list){
    // 业务逻辑
}
2. 使用list.size()作为状态

private List<Integer> list = new ArrayList<>();
for(int j = 0; j < list.size() ; j++){
    //业务逻辑
}
3. 初始化本地变量size

private List<Integer> list = new ArrayList<>();
int size  =  list.size()
for(int j = 0; j < list.size() ; j++){
    //
}
4. 初始化计时器的值

private List<Integer> list = new ArrayList<>();
for(int j = list.size(); j > size ; j--){
    //业务逻辑
}


比较这4种方式的性能,请看下面的程序。

public class LoopPerformance {
    private static List<Integer> list = new ArrayList<Integer>(1000000);


    static {
        for (int i = 0; i < 10000000; i++) {
            list.add(i);
        }
    }

    public void testLoopPerformance(){
        long startTime;
        long endTime;
        //style 1
        startTime = System.nanoTime();
        for (Integer i : list) {
            //
        }
        endTime = System.nanoTime();
        System.out.println("For each loop :: " + (endTime - startTime) + " ms");

        //style 2
        startTime = System.nanoTime();
        for (int j = 0; j < list.size(); j++) {
            //
        }
        endTime = System.nanoTime();
        System.out.println("Using collection.size() :: " + (endTime - startTime) + " ms");

        //style 3
        startTime = System.nanoTime();
        int size = list.size();
        for (int j = 0; j < size; j++) {
            //
        }
        endTime = System.nanoTime();
        System.out.println("Using [int size = list.size(); int j = 0; j < size ; j++] :: " + (endTime - startTime) + " ms");

        //style 4
        startTime = System.nanoTime();
        for (int j = list.size(); j > 0; j--) {
            //System.out.println(j);
        }
        endTime = System.nanoTime();
        System.out.println("Using [int j = list.size(); j > 0 ; j--] :: " + (endTime - startTime) + " ms");
    }
    public static void main(String[] args) {
        new LoopPerformance().testLoopPerformance();
    }
}

输出结果:
For each loop :: 48459306 ms
Using collection.size() :: 13065838 ms
Using [int size = list.size(); int j = 0; j < size ; j++] :: 12495 ms
Using [int j = list.size(); j > 0 ; j--] :: 9371 ms

显然,style 1 时间消耗最大,随后是style2。而style 3 和tyle 4的性能差别不大,可以考虑这两者是一样的。为什么会有这样的结果呢?
style 3 和style 4它们都采用了collection集合的初始值,然后,在循环中用到。唯一的区别在于使用上,一个是作为状态比较,而另一个则作为变量的初始值。style 2使用size()作为循环判断的标准,每次作比较的时,它都会被调用一次。尽管JVM优化了内联调用以及其他优化,但是,多为大量的调用,必然会花费不必要的时间。需要知道,这样编码,在机器上执行的代码语句(字节码)更多。style 4 是最花费性能的,原因是它内部使用循环的迭代iterator 形式。创建interator和调用interator.get() 上花费很多的时间。


分享到:
评论

相关推荐

    Java常用算法手册源代码

    1.4 算法的性能评价 1.4.1 时间复杂度 1.4.2 空间复杂度 1.5 一个算法实例 1.5.1 查找数字 1.5.2 创建项目 1.5.3 编译执行 1.6 Java程序的基本结构 1.6.1 类是一个基本单元 1.6.2 main方法 1.6.3 自定义方法 1.6.4 ...

    一个基于网格搜索和模拟退火的自动超参数调优程序_java_代码_下载

    超参调优有很多无聊的事情,比如给超参配置一堆值,给一堆日志文件命名,启动一堆进程,比较日志文件的结果等等,所以手动操作既费时又出错易于。 现有的一些自动超参数调优程序依赖于 Python,而老中易只依赖于字符...

    AI 人工智能学习之路(Python)

    学习深度学习可以通过掌握深度神经网络、卷积神经网络(CNN)和循环神经网络(RNN)等概念来实现。你可以学习深度学习框架如TensorFlow或PyTorch来实践深度学习算法。 数据处理和特征工程:了解如何处理和清洗数据、...

    Java版水果管理系统源码-Forward:Java+Android知识体系+Jetpack系列详解+MVVM实战(补充中......)

    Java版水果管理系统源码 Forward This project is for Study. Android学习路线 初级工程师:阅读官方文档+练习官方Demo 技术要求 四大组件使用 ...中级工程师:写文章要独立思考和有技术深度;...了解主线程的消息循环模

    初级java笔试题-Algorithms--part1:由KevinWayne和RobertSedgewick提供的算法课程

    初级java笔试题教学大纲 从 描述。 基本数据类型、算法和数据结构的介绍。 我们的重点是 Java 实现的应用程序和科学性能分析。 第一部分侧重于基本数据结构、排序和搜索。...Java,包括循环、数组、函数、递归和对象。

    控制语句、方法、递归算法(二)

    递归虽然精炼,但需要注意避免无限递归以及递归深度过深导致的性能问题。 掌握这些概念对于理解和编写程序至关重要,它们可以帮助你构建具有复杂逻辑的程序,并有效地解决问题。如果你想了解更多关于这些概念的信息...

    控制语句、方法、递归算法(一)

    递归虽然精炼,但需要注意避免无限递归以及递归深度过深导致的性能问题。 掌握这些概念对于理解和编写程序至关重要,它们可以帮助你构建具有复杂逻辑的程序,并有效地解决问题。如果你想了解更多关于这些概念的信息...

    [Android实例] Android 竖着的SeekBar.zip

    对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往...

    Andorid项目源码|(精华)新浪微博图片缓冲技术

    对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往...

    Andorid项目源码(168套).zip

    对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往...

    [Android实例] 【版主帖推荐】继人员列表,聊天的实现,包括图片,语音.zip

    对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往...

    [安卓开源项目]Android-炫酷的3D音乐播放器-各种特效OpenGL.zip

    对于现阶段的Android开发而言,技术深度很大一部分就体现在对Android系统底层的理解上。只有理解了底层的运作,我们才能更全面的掌握应用的行为、解决更多疑难杂症、并针对性的进行性能优化。同时,还能触类旁通,往...

    基于大数据平台数据分析技术选型调研.pdf

    缺少深度学习算法框架 Mahout ⽀持的语⾔:java,scala ⽀持的⽂件系统:HDFS ⽀持的数据库:Hive,HBase ⽀持的算法:分类,聚类,回归,降维,协同过滤 优点: 1. 基于hadoop实现 2. 利⽤MapReduce计算引擎,提升...

    数据结构讲义(严蔚敏版)(含算法源码)

    图的遍历:深度优先、广度优先(A) 最小生成树算法(两个)及其特点(A) 拓扑排序(A) 关键路径算法(A) 最短路径算法(两个)(A,O :时间复杂度) 8. 查找表 查找的有关概念,ASL等 顺序查找(A,P) 熟练...

    二十三种设计模式【PDF版】

    提供 Java运行性能,降低小而大量重复的类的开销. C. 行为模式 设计模式之 Command(命令) 什么是将行为封装,Command 是最好的说明. 设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer ...

    算法导论(part1)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

    算法导论(part2)

    书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),Oracle技术能够帮助提高就业的深度。 其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等...

Global site tag (gtag.js) - Google Analytics