全面測試JAVA各種迴圈的效能 for輕鬆勝出
阿新 • • 發佈:2018-11-07
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
鄭重道歉:
由於本人的一個低階失誤,造成結論錯誤,for才是最終的勝者。foreach和iterator是類似的機制,效能都不是很好。以下程式碼已經重新調整,再次道歉。
以前一直有人說,foreach的效能有損失,不建議使用,今天特意測試了一下,結果是 for方式的效能最好,foreach次之,而Iterator迴圈效能最差..
1 完整的測試程式碼
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- /**
- * 測試JAVA各種迴圈的效能。<br>
- * for 方式的效能最好,foreach次之,而Iterator迴圈效能最差。
- *
- * @author 老紫竹研究室(laozizhu.com)
- */
- public class TestLoop {
- public
- int number = 1000000;
- // 我們構造一個列表
- List<String> list = new ArrayList<String>(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<String> it = list.iterator();
- while (it.hasNext()) {
- testMethod(it.next());
- }
- System.out.printf("%10s=%10d/n", "iterator", (System.nanoTime() - begin));
- // 第三種,我們用index進行
- 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("測試陣列的效能...");
- // 我們再來測試陣列
- 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進行
- 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 執行結果
測試列表的效能...
foreach= 41997864
iterator= 43951774
for= 14351289
測試陣列的效能...
foreach= 1751863
for= 1484585
3 結論:
foreach的效能很一般,for才是最好的,推薦大家使用。
如果我的測試程式碼有問題,歡迎指正。