(转)以前一直有人说,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 static void main(String[] args) {
- 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) {
- }
- }
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- /**
- * 测试JAVA各种循环的性能。<br>
- * for 方式的性能最好,foreach次之,而Iterator循环性能最差。
- *
- * @author 老紫竹研究室(laozizhu.com)
- */
- public class TestLoop {
- public static void main(String[] args) {
- 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才是最好的,推荐大家使用。
|