For-each Loop,Index++ Loop , Iterator 那个效率更高
平时在写Java/C# 程序的时候,会写很多的Loop 语句,for() 及 Iterator loop 及Java 8 的foreach Loop, 这些Loop 那种效率最高呢?写个小程序测试一下。
Java8
public class LoopPerf {
  private static  int loopSize=5000000;
   public static void main(String args[]){
    LoopPerf loopPerf=new LoopPerf();
  }
}
public ArrayList<Integer> prepareData(int loopSize) {
  ArrayList list = new ArrayList<>(loopSize);
  for (int index = 0; index < loopSize; index++) {
    list.add(index);
  }
  return list;
}
1.经常使用的 for(int index=0;index<size;index++)
  public void indexLoop(){
    ArrayList<Integer> list = prepareData(loopSize);
    long start=System.currentTimeMillis();
    for(int index=0;index<list.size();index++){
      Integer temp=list.get(index);
      temp.toString();
    }
    long end=System.currentTimeMillis();
    System.out.println("indexLoop Time="+(end-start));
  }
运行结果 : indexLoop Time=393     
2. for loop
 public void forLoop(){
    ArrayList<Integer> list = prepareData(loopSize);
    long start=System.currentTimeMillis();
    for(Integer s:list){
      s.toString();
    }
    long end=System.currentTimeMillis();
    System.out.println("forLoop Time="+(end-start));
  }
运行结果:forLoop Time=367
3. for iterator Loop
 private void iteratorLoop(){
    List<Integer> a = prepareData(loopSize);
    long start=System.currentTimeMillis();
    for (Iterator iterator = a.iterator();iterator.hasNext();)
    {
      Integer integer = (Integer) iterator.next();
      integer.toString();
    }
    long end=System.currentTimeMillis();
    System.out.println("iteratorLoop Time="+(end-start));
  }
运行结果:forLoop Time=368
4.foreach loop(java 8)
 private void forEachLoop(){
    List<Integer> a = prepareData(loopSize);
    long start=System.currentTimeMillis();
    a.forEach(item->item.toString());
    long end=System.currentTimeMillis();
    System.out.println("forEachLoop Time="+(end-start));
  }
运行结果:forEachLoop Time=372
分析其中的结果,2,3的结果是非常接近的。看到 2,3 生成的java class byte code 代码是一样的。
例子 2 的java class byte code
// Byte code
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
//例子3的java class byte code List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();)
{
Integer integer = (Integer) iterator.next();
integer.toString();
}
// Bytecode:
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
从运行结果看,2,3是效率最高的,4次之,1效率最差。
http://bbs.pinggu.org/?fromuid=5397734
For-each Loop,Index++ Loop , Iterator 那个效率更高的更多相关文章
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范
		
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
 - RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范
		
角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...
 - Spring AOP中的JDK和CGLib动态代理哪个效率更高?
		
一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...
 - MySQL select * 和把所有的字段都列出来,哪个效率更高?
		
MySQL select * 和把所有的字段都列出来,哪个效率更高 答案是:如何,都不推荐使用 SELECT * FROM (1)SELECT *,需要数据库先 Query Table Metadat ...
 - Http请求封装(对HttpClient类的进一步封装,使之调用更方便。另外,此类管理唯一的HttpClient对象,支持线程池调用,效率更高)
		
package com.ad.ssp.engine.common; import java.io.IOException; import java.util.ArrayList; import jav ...
 - 在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D('Video')效率更高呢
		
在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D('Video')效率更高呢
 - 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!
		
作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper. Mybatis Generator 是 ...
 - i++与++i哪个效率更高
		
简单的比较前缀自增运算符和后缀自增运算符的效率是片面的, 因为存在很多因素影响这个问题的答案. 首先考虑内建数据类型的情况: 如果自增运算表达式的结果没有被使用, 而是仅仅简单地用于增加一元操作数, ...
 - 数据库查询SQL语句的时候如何写会效率更高?
		
引言 以前刚开始做项目的时候,开发经验尚浅,遇到问题需求只要把结果查询出来就行,至于查询的效率可能就没有太多考虑,数据少的时候还好,数据一多,效率问题就显现出来了.每次遇到查询比较慢时,项目经理就会问 ...
 
随机推荐
- git下的团队合作模型及git基础知识汇集
			
https://www.atlassian.com/git/tutorials/syncing/git-fetch Syncing svn使用单个中央库来作为开发者之间沟通的桥梁,而协同合作是通过在开 ...
 - c#编程指南(五) 扩展方法(Extension Method)
			
C# 3.0就引入的新特性,扩展方法可以很大的增加你代码的优美度,扩展方法提供你扩展.NET Framewoke类的扩展途径,书写和规则也简单的要命. 编写扩展方法有下面几个要求: 第一:扩展方法所在 ...
 - Python 爬虫 根据属性值关键字搜索标签
			
# <div class='\"name\"'>客如云</div> company_name = soup.find_all('div',class_=re ...
 - angular2 ng build --prod 报错:Module not found: Error: Can't resolve './$$_gendir/app/app.module.ngfactory'
			
调试页面 ng serve 正常 ng build 也正常 ng build --prod 异常:Module not found: Error: Can't resolve './$$_gendir ...
 - 基于腾讯云centos简单搭建VSFTP
			
基于腾讯云centos7.3搭建VSFTP 环境分析: 基于vsftp服务在于云主机上,所以推荐使用FTP的PASV模式: FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动 ...
 - Docker技术三大要点:cgroup, namespace和unionFS的理解
			
www.docker.com的网页有这样一张有意思的动画: 从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程. Docker ...
 - MySQL绿色解压缩版安装与配置
			
操作步骤: 一.安装MySQL数据库 1.下载MySQL-5.6.17-winx64.zip文件.2.解压到指定目录,本例为D:\mysql-5.6.17-winx64.3.修改配置文件,my-def ...
 - CRUD是什么?数据结构、增查删改
			
http://blog.csdn.net/penginpha/article/details/6920444 CRUD是指在做计算处理时的增加(Create).查询(Retrieve)(重新得到数据) ...
 - C++实现的Buffer类
			
写C#的同志一定觉得Byte []比C++的 BYTE * 加 Length的方式好的多.一来,只需要一个对象就可以是表示一段字节流,另一方面,由于C#的特性,不需要象C++那样还要记得删除指针.由于 ...
 - MyEclipse 根据左括号或右括号查找另外一半
			
在MyEclipse 中如果代码嵌套太多,查找括号是一件非常头疼的事情,今天突然发现了一个快捷键(如下)可以直接定位到另外一半的位置 Ctrl+Shift+P,光标会自动跳到相应的花括号位置, 并且可 ...