public class TestFor { public static long startTime; public static long endTime; public static int a = 1; public static int b = 1; public static int c = 1; public static int d; public static void main(String[] args) { // 嵌套循环 --- 性能对比 外小内大 外大内小 startTime = System.nanoTime(); for (int i = 0; i < 200000; i++) { for (int j = 0; j < 100000; j++) { for (int k = 0; k < 10; k++) { } } } endTime = System.nanoTime(); System.out.println("外大内小耗时:"+ (endTime - startTime)); startTime = System.nanoTime(); for (int u = 1; u <10 ; u++) { for (int y = 1; y < 100000; y++) { for (int i = 0; i < 200000; i++) { } } } endTime = System.nanoTime(); System.out.println("外小内大耗时:"+(endTime - startTime)); System.out.println("-----------隔离----------"); // 2、提取与循环无关的表达式 startTime = System.nanoTime(); for (int i = 0; i < 200000; i++) { i=i*a*b; } endTime = System.nanoTime(); System.out.println("提取前耗时:"+(endTime-startTime)); startTime = System.nanoTime(); c = a*b; for (int i = 0; i < 200000; i++) { i=c*i; } endTime = System.nanoTime(); System.out.println("提取后耗时:" + (endTime-startTime)); System.out.println("-----------隔离----------"); // 3.消除循环终止判断时的方法调用 ArrayList<String> list = new ArrayList<String>(); list.add("爱护世界"); list.add("保护环境"); list.add("爱护地球"); list.add("从我做起"); startTime = System.nanoTime(); for (int i = 0; i < list.size(); i++) { } endTime = System.nanoTime(); System.out.println("消除前:" + (endTime - startTime)); startTime = System.nanoTime(); int size = list.size(); for (int i = 0; i < size; i++) { } endTime = System.nanoTime(); System.out.println("消除后:" + (endTime - startTime)); System.out.println("-----------隔离----------"); // 4、异常捕获 startTime = System.nanoTime(); for (int i = 0; i < 10000000; i++) { try { } catch (Exception e) { } } endTime = System.nanoTime(); System.out.println("在内部捕获异常耗时:"+(endTime - startTime)); startTime = System.nanoTime(); try { for (int i = 0; i < 10000000; i++) { } } catch (Exception e) { } endTime = System.nanoTime(); System.out.println("在外部捕获异常耗时:" + (endTime - startTime)); } }
结果对比:
外大内小耗时:9415206900
外小内大耗时:13851900
-----------隔离----------
提取前耗时:566800
提取后耗时:787400
-----------隔离----------
消除前:2500
消除后:600
-----------隔离----------
在内部捕获异常耗时:8434800
在外部捕获异常耗时:7284300
对于以上第一个结果的理解,就网上说的而已,相当于复制很多小文件和复制很多大文件的区别
对于第二结果的理解,有人测试出提取后出来的是耗时更短,为啥我这样提取出来的时间更长,是因为c=a*b 多了,new了个c耗时长了?
对于第三个结果的理解,优化很明显,第一个是多次循环调用size()方法耗时更长,而第二个只调用了一次size()方法,耗时区别在这里。
对于第四个结果的理解,我也是比较困惑的,有时候,外部耗时比内部耗时高; 大部分时候捕获异常耗时外部比内部的耗时低,多次循环trycatch的区别和只trycatch一次的耗时区别吧。