JAVA技巧:全面測試JAVA各種循環(huán)的性能

字號:

以前一直有人說,foreach的性能有損失,不建議使用,今天特意測試了一下,結(jié)果是 for方式的性能,foreach次之,而Iterator循環(huán)性能最差..
    1 完整的測試代碼
    view plaincopy to clipboardprint?
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    /**
    * 測試JAVA各種循環(huán)的性能。
    * for 方式的性能,foreach次之,而Iterator循環(huán)性能最差。
    *
    * @author 考試大
    */
    public class TestLoop {
    public static void main(String[] args) {
    int number = 1000000;
    // 我們構(gòu)造一個(gè)列表
    List list = new ArrayList(number);
    for (int i = 0; i < number; i++) {
    list.add(Integer.toString(i));
    }
    System.out.println("測試列表的性能...");
    // 我們用foreach方式測試
    long begin = System.nanoTime();
    for (String i : list) {
    testMethod(i);
    }
    System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
    begin = System.nanoTime();
    // 下面我們用Iterator測試
    Iterator it = list.iterator();
    while (it.hasNext()) {
    testMethod(it.next());
    }
    System.out.printf("%10s=%10d\n", "iterator", (System.nanoTime() - begin));
    // 第三種,我們用index進(jìn)行
    begin = System.nanoTime();
    for (int i = 0; i < number; i++) {
    testMethod(list.get(i));
    }
    System.out.printf("%10s=%10d\n", "for", (System.nanoTime() - begin));
    System.out.println("測試數(shù)組的性能...");
    // 我們再來測試數(shù)組
    String[] strArr = new String[number];
    for (int i = 0; i < number; i++) {
    strArr[i] = Integer.toString(i);
    }
    // 我們用foreach方式測試
    begin = System.nanoTime();
    for (String i : strArr) {
    testMethod(i);
    }
    System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
    // 第二種,我們用index進(jìn)行
    begin = System.nanoTime();
    for (int i = 0; i < number; i++) {
    testMethod(strArr[i]);
    }
    System.out.printf("%10s=%10d\n", "for", System.nanoTime() - begin);
    }
    public static void testMethod(String str) {
    }
    }
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    /**
    * 測試JAVA各種循環(huán)的性能。
    * for 方式的性能,foreach次之,而Iterator循環(huán)性能最差。
    *
    * @author 考試大
    */
    public class TestLoop {
    public static void main(String[] args) {
    int number = 1000000;
    // 我們構(gòu)造一個(gè)列表
    List list = new ArrayList(number);
    for (int i = 0; i < number; i++) {
    list.add(Integer.toString(i));
    }
    System.out.println("測試列表的性能...");
    // 我們用foreach方式測試
    long begin = System.nanoTime();
    for (String i : list) {
    testMethod(i);
    }
    System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
    begin = System.nanoTime();
    // 下面我們用Iterator測試
    Iterator it = list.iterator();
    while (it.hasNext()) {
    testMethod(it.next());
    }
    System.out.printf("%10s=%10d\n", "iterator", (System.nanoTime() - begin));
    // 第三種,我們用index進(jìn)行
    begin = System.nanoTime();
    for (int i = 0; i < number; i++) {
    testMethod(list.get(i));
    }
    System.out.printf("%10s=%10d\n", "for", (System.nanoTime() - begin));
    System.out.println("測試數(shù)組的性能...");
    // 我們再來測試數(shù)組
    String[] strArr = new String[number];
    for (int i = 0; i < number; i++) {
    strArr[i] = Integer.toString(i);
    }
    // 我們用foreach方式測試
    begin = System.nanoTime();
    for (String i : strArr) {
    testMethod(i);
    }
    System.out.printf("%10s=%10d\n", "foreach", System.nanoTime() - begin);
    // 第二種,我們用index進(jìn)行
    begin = System.nanoTime();
    for (int i = 0; i < number; i++) {
    testMethod(strArr[i]);
    }
    System.out.printf("%10s=%10d\n", "for", System.nanoTime() - begin);
    }
    public static void testMethod(String str) {
    }
    }
    2 運(yùn)行結(jié)果
    測試列表的性能...
    foreach= 41997864
    iterator= 43951774
    for= 14351289
    測試數(shù)組的性能...
    foreach= 1751863
    for= 1484585
    3 結(jié)論:
    foreach的性能很一般,for才是的,推薦大家使用。