java中不同循环的系能比较
2015-12-07 13:17
483 查看
在像java这种编程语言中,循环是控制流的最常用的方法之一,在这篇文章中我不打算讨论循环的一些基本的知识,这已经超出本篇文章的范围并且大家已经对此非常的了解了。
在这篇文章中,我将列出在日常中用到的循环的不同的方式并且使用相同的集合比较他们的性能
运行环境
java 7
eclipse Juno
当执行上边的代码的时候会在控制台输出下边的运行情况
很明显后边的两种方式的性能比较好,而for each的系能和其它三者相比是最昂贵的
第二种在每次调用的时候使用size方法,这是导致性能问题的主要原因。
第一种方式是最耗时的,原因是每个循环内部使用创建的遍历,创建一个遍历和调用iterator.get()和其他三种方法比有很高的性能消耗
原文地址:http://howtodoinjava.com/2013/03/26/performance-comparison-of-different-for-loops-in-java/
在这篇文章中,我将列出在日常中用到的循环的不同的方式并且使用相同的集合比较他们的性能
不同的循环
我将列出我知道的四中不同的方式,如果你知道其他的方式,请通过评论得方式告诉我for each 语句
这个技术是在java 5之后使用的private static List<Integer> list = new ArrayList<>(); for(Integer i : list) { // do other stuff }
使用list.size()
private static List<Integer> list = new ArrayList<>(); for(int j = 0; j < list.size() ; j++) { //do stuff }
使用size初始化另一个本地变量
private static List<Integer> list = new ArrayList<>(); int size = list.size(); for(int j = 0; j < size ; j++) { //do stuff }
在循环内部初始化
private static List<Integer> list = new ArrayList<>(); for(int j = list.size(); j > size ; j--) { //do stuff }
比较所有类型的性能
我创建了一个ArrayList并且存入1千万的整数,然后使用者四种方式遍历它,通过这种方式我们可以看到系能的不同运行环境
java 7
eclipse Juno
package com.howtodoinjava.demo.core; import java.util.ArrayList; import java.util.Calendar; import java.util.List; public class ForLoopPerformanceTest { private static List<Integer> list = new ArrayList<>(); private static long startTime; private static long endTime; static { for(int i=0; i < 1_00_00_000; i++) { list.add(i); } } @SuppressWarnings("unused") public static void main(String[] args) { //Type 1 startTime = Calendar.getInstance().getTimeInMillis(); for(Integer i : list) { // } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("For each loop :: " + (endTime - startTime) + " ms"); //Type 2 startTime = Calendar.getInstance().getTimeInMillis(); for(int j = 0; j < list.size() ; j++) { // } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("Using collection.size() :: " + (endTime - startTime) + " ms"); //Type 3 startTime = Calendar.getInstance().getTimeInMillis(); int size = list.size(); for(int j = 0; j < size ; j++) { //System.out.println(j); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("Using [int size = list.size(); int j = 0; j < size ; j++] :: " + (endTime - startTime) + " ms"); //Type 4 startTime = Calendar.getInstance().getTimeInMillis(); for(int j = list.size(); j > size ; j--) { //System.out.println(j); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println("Using [int j = list.size(); j > size ; j--] :: " + (endTime - startTime) + " ms"); } }
当执行上边的代码的时候会在控制台输出下边的运行情况
For each loop :: 110 ms Using collection.size() :: 37 ms Using [int size = list.size(); int j = 0; j < size ; j++] :: 4 ms Using [int j = list.size(); j > size ; j--] :: 1 ms
很明显后边的两种方式的性能比较好,而for each的系能和其它三者相比是最昂贵的
性能不同的原因
后边两种的性能差别不大,应该认为是相同的。他们都同样获取集合的大小,然后在循环中使用这个值来检查条件是否成立第二种在每次调用的时候使用size方法,这是导致性能问题的主要原因。
第一种方式是最耗时的,原因是每个循环内部使用创建的遍历,创建一个遍历和调用iterator.get()和其他三种方法比有很高的性能消耗
原文地址:http://howtodoinjava.com/2013/03/26/performance-comparison-of-different-for-loops-in-java/
相关文章推荐
- 第二章 Spring Security起步
- java int与byte【】之间的转换
- SpringMVC_RESTful简易笔记
- Java 8十个lambda表达式案例
- mysq连接 mysql-connector-java-5.1.34.jar
- SpringMVC整合Swagger框架
- 在Eclipse 中,选择一个变量名,其他相同变量名都高亮阴影显示 的设置
- java中while的用法
- 简单谈谈Java中String类型的参数传递问题
- java实现图片与base64字符串之间的转换
- Java关键字final、static使用总结 - 熔 岩 - 51CTO技术博客
- java socket编程之聊天室(一)
- Spring mvc 实例 --JSTL结合EL实现JSP获取后台List回显界面
- JAVA线程池学习以及队列拒绝策略
- 【leetcode】Peeking Iterator
- 【工具】线程安全的JdbcTemplate.java
- JAVA反射常用方法
- Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录
- 关于Spring报指针异常的问题的解决方案
- java pdf写入中文时不显示,如何解决。