`

关于JAVA for循环效率的问题

 
阅读更多

今天在C#里面看到:
之前一直认为
for (int i = 0, h = arr.Count; i < h; i++)

for (int i = 0; i < arr.Count; i++)
两种写法,在C#里应该是差不多的,今天突然有人问,就写了个程序测试了一下,结果出乎我的意料
如果arr是List<T>,前者的效率比后者高大约一倍,如果arr是string[],两者效率基本差不多

原帖子地址:http://topic.csdn.net/u/20120706/16/CEB33682-FF71-402C-9FE9-580F5ECFDFC1.html

我写的代码测试:int tnum = 1000000; // 添加或查找的次数
int outnum = 10; // 外层循环次数
ArrayList<String> arr = new ArrayList<String>();
for (int i = 0; i < tnum; i++) {
arr.add(Integer.toString(i));
}
String[] arr2 = new String[tnum];
for(int j=0;j<outnum;j++)
{
Long time = System.currentTimeMillis();
String msg;
    msg = "Number ";
    for (int i = 0, h = arr.size(); i < h; i++)
    {
    }
   time = System.currentTimeMillis()-time;
   System.out.println(msg+"耗时:"+time);

    msg = ".Count ";
    time = System.currentTimeMillis();
    for (int i = 0; i < arr.size(); i++)
    {
    }
    time = System.currentTimeMillis()-time;
    System.out.println(msg+"耗时:"+time);

    msg = "Length ";
    time = System.currentTimeMillis();
    for (int i = 0; i < arr2.length; i++)
    {
    }
    time = System.currentTimeMillis()-time;
    System.out.println(msg+"耗时:"+time);
}
我发现时间都差不多啊,难道是因为ArrayList的原因?还是JAVA这个用的时间本来就是一样的?

============================================================================

LZ这样比较是很难看出来的,还是查看伪代码指令比较好理解

Java code?
1
2
3
4
5
6
7
8
import java.util.*;
public class jp {
    public static void main(String[] args) throws Throwable {
        List<String> list = new ArrayList<String>();
        for (int i=0, j=list.size(); i<j; i++); //list.size()只调用一次
        for (int i=0; i<list.size(); i++); //list.size()每次都调用
    }
}



javac jp.java //编译
javap -c jp //查看伪代码指令

E:\Test>javap -c jp
Compiled from "jp.java"
public class jp {
  public jp();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":
()V
       4: return

  public static void main(java.lang.String[]) throws java.lang.Throwable;
    Code:
       0: new           #2                  // class java/util/ArrayList
       3: dup
       4: invokespecial #3                  // Method java/util/ArrayList."<init
>":()V
       7: astore_1
       8: iconst_0
       9: istore_2
      10: aload_1
      11: invokeinterface #4,  1            // InterfaceMethod java/util/List.si
ze:()I
      16: istore_3
      17: iload_2
      18: iload_3
      19: if_icmpge     28
      22: iinc          2, 1
      25: goto          17

      28: iconst_0
      29: istore_2
      30: iload_2
      31: aload_1
      32: invokeinterface #4,  1            // InterfaceMethod java/util/List.si
ze:()I
      37: if_icmpge     46
      40: iinc          2, 1
      43: goto          30

      46: return
}

红色部分是第一种循环情况
8: iconst_0把0入栈
9: isrote_2把0出栈并赋给2号索引变量i,即i=0操作,1号索引变量是list,即前面的astore_1把ArrayList对象赋给1号索引变量
10: aload_1把1号索引变量入栈,即list入栈
11: invokeinterface把list出栈并调用其size方法,把结果入栈
16: istore_3把size方法的结果出栈并赋给3号索引变量j,即j=list.size()操作
17: iload_2
18: iload_3 把2,3号索引变量入栈
19: if_icmpge     28 比较入栈的两个数据,前者大于等于后者则跳转到28行指令,即不满足i<j跳转
22: iinc          2, 1 2号索引变量i自增1
25: goto          17 跳转到17行指令,即for重新开始循环


蓝色部分是第二种情况(循环体)
28:iconst_0 0入栈
29:istore_2 0出栈并赋给i
30:iload_2 i入栈
31:aload_1 list入栈
32:invokeinterface list出栈并调用size方法,把结果入栈
37: if_icmpge     46 比较入栈的两个数据,前者大于等于后者则跳转到46行指令,即不满足i<list.size
40: iinc          2, 1 2号索引变量i自增1
43: goto          30 跳转到30行指令,即for重新开始循环


比较可以看出,第一种情况,list.size只需要执行一次,第二种则每次循环都要执行

分享到:
评论

相关推荐

    Java中增强for循环的实现原理和坑详解

    Java中增强for循环的实现原理和坑详解 Java中增强for循环是一种强大且方便的迭代功能,自JDK 1.5以来,它已经成为Java开发者必备的技能之一。然而,许多开发者并不了解增强for循环的实现原理和可能存在的坑。下面...

    java基础for循环练习题

    在"java基础for循环练习题"中,我们通常会遇到几种类型的`for`循环,包括基本的`for`循环、增强型`for`循环(也称为foreach循环),以及在数组和集合中的应用。下面我们将深入探讨这些知识点。 1. **基本的for循环*...

    Java程序设计基础:for循环.pptx

    ### Java程序设计基础:深入解析for循环 #### 一、for循环概述 在Java程序设计中,循环控制结构是编程的基础之一,它允许程序代码多次重复执行特定的任务或操作。`for`循环作为循环结构中的一种,是Java中最常用且...

    Java for循环标签跳转到指定位置的示例详解

    在Java编程语言中,for循环是一种常用的迭代结构,它允许我们按照特定的条件重复执行一段代码。在某些复杂的逻辑处理中,我们可能需要在循环内部强制跳出循环或者跳转到循环的某个特定位置,这时标签(label)就派上...

    js,java提高编程效率之【for循环优化】.pdf

    本文主要讨论了如何优化JavaScript和Java中的for循环,以提高编程效率。 首先,我们来回顾一下传统的for循环语法: ```javascript for(var i = 0; i ; i++) { // 对arrays[i]进行处理 } ``` 这段代码适用于遍...

    Java for循环性能优化实现解析

    Java for循环性能优化实现解析 Java for循环性能优化实现解析是 Java 编程中非常重要的一部分,主要讨论了Java for循环性能优化的实现解析。下面是从文件中提炼出的相关知识点: 1. 嵌套循环优化 在Java中,嵌套...

    关于Java中的循环

    ### 关于Java中的循环 在Java编程语言中,循环是一种重要的控制结构,它允许程序员重复执行一段代码,直到满足特定条件为止。Java提供了几种不同类型的循环结构,包括`while`循环、`do-while`循环以及`for`循环。...

    01-Java语言基础(语句-For循环嵌套)

    Java中的For循环嵌套是解决复杂问题的重要工具,它可以帮助我们有效地处理数据,实现复杂的算法。通过熟练掌握这一技巧,你将能够编写出更加灵活和高效的Java程序。在实际编程中,不断练习和实践是提升技能的关键。

    java循环结构学习教案.pptx

    本节课程主要讲解Java中的循环结构,包括while循环、do-while循环和for循环。通过学习本节课程,学生将能够理解循环的含义,学会使用while循环、do-while循环和for循环结构,并能够使用调试解决简单的程序错误。 一...

    视频教程:Java中的For循环语句用法精讲.rar

    Java中的For循环是编程语言中最基础且常用的控制流结构之一,尤其在处理迭代或重复任务时,它的灵活性和效率使其成为首选。这个“视频教程:Java中的For循环语句用法精讲.rar”旨在深入讲解Java中For循环的各个方面...

    JDK1.5中增强for循环

    随着 Java 技术的不断发展,为了提高开发效率、简化代码编写并增强可读性,JDK 1.5 引入了一系列的新特性,其中就包括了增强 for 循环(Enhanced For Loop),也被称作“for-each”循环。这一特性极大地简化了数组和...

    Java代码循环的优化

    ### Java代码循环的优化 在Java编程中,循环是实现重复执行特定代码块的基本结构之一。随着程序复杂度的提高,循环的效率直接影响到整个应用的性能表现。因此,优化循环成为了提高程序运行效率的关键步骤之一。下面...

    Java数组链表效率-Java数组和链表三种遍历效率对比 数组和链表.pdf

    对于数组结构,迭代器遍历和增强 for 循环是优于普通 for 循环的,而对于链表结构,普通 for 循环的效率太慢,不推荐使用,迭代器遍历和增强 for 循环是优于普通 for 循环的。 在实际开发中,开发者可以根据具体的...

    Java基础之for循环嵌套.docx

    ### Java基础之for循环嵌套 #### 概念与特点 在Java编程语言中,循环结构是实现重复操作的关键组成部分之一。嵌套循环是指在一个循环内部包含另一个完整的循环体,通常用于处理多维数据结构(如二维数组)或在解决...

    Java中for循环语句实例.pdf

    总的来说,Java的for循环语句是编程中不可或缺的一部分,它使得重复性的任务得以自动化,提高了代码的效率和可读性。理解并熟练运用for循环,对于任何Java程序员来说都是至关重要的。通过不断练习和实践,可以掌握更...

    Java循环结构for语句while语句详解-Java教程

    在Java中,有两种主要的循环结构:for循环和while循环,这两种循环在编写控制流程、处理数组、迭代集合等场景时非常常见。 **一、for循环** for循环是一种预定义迭代的循环结构,适用于已知循环次数的情况。基本...

    Java for循环Map集合优化实现解析

    "Java for循环Map集合优化实现解析" Java for循环Map集合优化实现解析是...Java for循环Map集合优化实现解析是一种高效的集合优化技术,通过使用Map集合来优化for循环的性能,减少循环次数,从而提高程序的执行效率。

    多重For循环 优化

    ### 多重For循环优化分析 #### 原始代码分析 原始代码示例如下: ```java for(int i = 0; i ; i++) { for(int j = 0; j ; j++) { for(int k = 0; k ; k++) { log(i * j * k); } } } ``` 此段代码中的嵌套循环...

    Java for循环几种写法整理

    Java for循环是编程中最常用的控制流结构之一,用于重复执行一段代码直到满足特定条件为止。在Java中,for循环有多种不同的写法,主要用于遍历数组、集合等数据结构。以下是对Java for循环几种写法的详细说明: 1. ...

    java初级—循环练习题答案

    为了提高效率,应避免在循环体中进行不必要的计算,或者考虑使用增强型for循环(foreach)来简化代码,尤其在遍历集合或数组时。 在"ClassAfter"这个文件中,可能包含了对这些概念的实践应用和解答,包括各种循环...

Global site tag (gtag.js) - Google Analytics