平时在写Java/C# 程序的时候,会写很多的Loop 语句,for() 及 Iterator loop 及Java 8 的foreach Loop, 这些Loop 那种效率最高呢?写个小程序测试一下。

Java8

  1. public class LoopPerf {
  2. private static int loopSize=5000000;
  3. public static void main(String args[]){
  4. LoopPerf loopPerf=new LoopPerf();
  5. }
  6. }
  7.  
  8. 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++)

  1. public void indexLoop(){
  2. ArrayList<Integer> list = prepareData(loopSize);
  3. long start=System.currentTimeMillis();
  4. for(int index=0;index<list.size();index++){
  5. Integer temp=list.get(index);
  6. temp.toString();
  7. }
  8. long end=System.currentTimeMillis();
  9. System.out.println("indexLoop Time="+(end-start));
  10. }
  11.  
  12. 运行结果 : indexLoop Time=393    

2. for loop

  1. public void forLoop(){
  2. ArrayList<Integer> list = prepareData(loopSize);
  3. long start=System.currentTimeMillis();
  4. for(Integer s:list){
  5. s.toString();
  6. }
  7. long end=System.currentTimeMillis();
  8. System.out.println("forLoop Time="+(end-start));
  9. }
  10.  
  11. 运行结果:forLoop Time=367

3. for iterator Loop

  1. private void iteratorLoop(){
  2. List<Integer> a = prepareData(loopSize);
  3. long start=System.currentTimeMillis();
  4. for (Iterator iterator = a.iterator();iterator.hasNext();)
  5. {
  6. Integer integer = (Integer) iterator.next();
  7. integer.toString();
  8. }
  9. long end=System.currentTimeMillis();
  10. System.out.println("iteratorLoop Time="+(end-start));
  11. }
  1. 运行结果:forLoop Time=368

4.foreach loop(java 8)

  1. private void forEachLoop(){
  2. List<Integer> a = prepareData(loopSize);
  3. long start=System.currentTimeMillis();
  4. a.forEach(item->item.toString());
  5. long end=System.currentTimeMillis();
  6. System.out.println("forEachLoop Time="+(end-start));
  7. }
    运行结果:forEachLoop Time=372

分析其中的结果,2,3的结果是非常接近的。看到 2,3 生成的java class byte code 代码是一样的。

  1. 例子 2 java class byte code
    // Byte code
  2. ALOAD 1
  3. INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
  4. ASTORE 3
  5. GOTO L2
  6. L3
  7. ALOAD 3
  8. INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
  9. CHECKCAST java/lang/Integer
  10. ASTORE 2
  11. ALOAD 2
  12. INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
  13. POP
  14. L2
  15. ALOAD 3
  16. INVOKEINTERFACE java/util/Iterator.hasNext()Z
  17. IFNE L3
  1. //例子3的java class byte code
  2.  
  3. List<Integer> a = new ArrayList<Integer>();
  4. for (Iterator iterator = a.iterator(); iterator.hasNext();)
  5. {
  6. Integer integer = (Integer) iterator.next();
  7. integer.toString();
  8. }
  9. // Bytecode:
  10. ALOAD 1
  11. INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
  12. ASTORE 2
  13. GOTO L7
  14. L8
  15. ALOAD 2
  16. INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
  17. CHECKCAST java/lang/Integer
  18. ASTORE 3
  19. ALOAD 3
  20. INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
  21. POP
  22. L7
  23. ALOAD 2
  24. INVOKEINTERFACE java/util/Iterator.hasNext()Z
  25. IFNE L8

从运行结果看,2,3是效率最高的,4次之,1效率最差。

http://bbs.pinggu.org/?fromuid=5397734

For-each Loop,Index++ Loop , Iterator 那个效率更高的更多相关文章

  1. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->WinForm版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  2. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->Web版本新增新的角色授权管理界面效率更高、更规范

    角色授权管理模块主要是对角色的相应权限进行集中设置.在角色权限管理模块中,管理员可以添加或移除指定角色所包含的用户.可以分配或授予指定角色的模块(菜单)的访问权限.可以收回或分配指定角色的操作(功能) ...

  3. Spring AOP中的JDK和CGLib动态代理哪个效率更高?

    一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...

  4. MySQL select * 和把所有的字段都列出来,哪个效率更高?

    MySQL select * 和把所有的字段都列出来,哪个效率更高 答案是:如何,都不推荐使用 SELECT * FROM (1)SELECT *,需要数据库先 Query Table Metadat ...

  5. Http请求封装(对HttpClient类的进一步封装,使之调用更方便。另外,此类管理唯一的HttpClient对象,支持线程池调用,效率更高)

    package com.ad.ssp.engine.common; import java.io.IOException; import java.util.ArrayList; import jav ...

  6. 在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D('Video')效率更高呢

    在类中,调用这个类时,用$this->video_model是不是比每次调用这个类时D('Video')效率更高呢  

  7. 取代 Mybatis Generator,这款代码生成神器配置更简单,开发效率更高!

    作为一名 Java 后端开发,日常工作中免不了要生成数据库表对应的持久化对象 PO,操作数据库的接口 DAO,以及 CRUD 的 XML,也就是 mapper. Mybatis Generator 是 ...

  8. i++与++i哪个效率更高

    简单的比较前缀自增运算符和后缀自增运算符的效率是片面的, 因为存在很多因素影响这个问题的答案. 首先考虑内建数据类型的情况: 如果自增运算表达式的结果没有被使用, 而是仅仅简单地用于增加一元操作数, ...

  9. 数据库查询SQL语句的时候如何写会效率更高?

    引言 以前刚开始做项目的时候,开发经验尚浅,遇到问题需求只要把结果查询出来就行,至于查询的效率可能就没有太多考虑,数据少的时候还好,数据一多,效率问题就显现出来了.每次遇到查询比较慢时,项目经理就会问 ...

随机推荐

  1. 'weblogic.kernel.Default (self-tuning) 问题weblogic层面解决办法

    声明:出现这个问题有程序方面.网络方面.weblogic设置方面等等原因,此文章主要讲述由于weblogic设置而导致的解决办法. 因为: 1.程序问题,需要项目自己去解决,weblogic在做优化处 ...

  2. mobile webiste 中的css的font-size em及line-height等换算

    在mobile web设计 中,我们常常需要使用em这个字体大小的单位.em到底是多少呢? em到底应该设置为多少个em呢?通常换算成方法是1em=target fontsize we want/fo ...

  3. 抓取windows系统进程

    最近在开发辅流分享界面,然后之前的windows编程的代码都忘记了,翻到了一个博客,具体的还是去msdn去查函数,这个是入门的链接如下: http://blog.csdn.net/zdragon200 ...

  4. Python学习---递归函数的学习

    定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归特性: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 ...

  5. 数据结构之排序技术:快速排序、归并排序、堆排序(C++版)

    快速排序 #include <iostream> using namespace std; void swap(int num[], int i, int j) { int temp = ...

  6. HBase编程 API入门系列之put(客户端而言)(1)

    心得,写在前面的话,也许,中间会要多次执行,连接超时,多试试就好了. [hadoop@HadoopSlave1 conf]$ cat regionservers HadoopMasterHadoopS ...

  7. JsonHelp

    using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using System; u ...

  8. BZOJ3999:[TJOI2015]旅游(树链剖分)

    Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会 ...

  9. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  10. VC++ MFC SDI/MDI Ribbon程序的停靠窗格被关闭后如何再次显示

    VC++ 创建基于MFC的SDI应用程序,Visual Studio风格的主界面如下图所示,在该主界面上的视图菜单下包含有队对各个可停靠窗格显示或隐藏的控制菜单项.而基于Ribbon风格的应用程序,所 ...