zoukankan      html  css  js  c++  java
  • java性能优化之for循环

    嵌套循环

    stratTime = System.nanoTime();  
    for (int i = 0; i < 10000000; i++) {  
        for (int j = 0; j < 10; j++) {  
              
        }  
    }  
    endTime = System.nanoTime();  
    System.out.println("外大内小耗时:"+ (endTime - stratTime)); 

    应改为:

    stratTime = System.nanoTime();  
    for (int i = 0; i <10 ; i++) {  
        for (int j = 0; j < 10000000; j++) {  
              
        }  
    }  
    endTime = System.nanoTime();  
    System.out.println("外小内大耗时:"+(endTime - stratTime)); 

    两者耗时对比:

    外大内小耗时:200192114  
    外小内大耗时:97995997  

      由以上对比可知,优化后性能提升了一倍,嵌套循环应该遵循“外小内大”的原则,这就好比你复制很多个小文件和复制几个大文件的区别。

    提取与循环无关的表达式

    stratTime = System.nanoTime();  
    for (int i = 0; i < 10000000; i++) {  
        i=i*a*b;  
    }  
    endTime = System.nanoTime();  
    System.out.println("未提取耗时:"+(endTime - stratTime));  

    应改为:

    stratTime = System.nanoTime();  
    c = a*b;  
    for (int i = 0; i < 10000000; i++) {  
        i=i*c;  
    }  
    endTime = System.nanoTime();  
    System.out.println("已提取耗时:"+(endTime - stratTime)); 

    两者耗时对比:

    未提取耗时:45973050  
    已提取耗时:1955 

      代码中a+b与我们的循环无关,所以应该把它放到外面,避免重复计算,可以看出,优化后性能提升了好几个数量级,这些是不容忽视的。

    消除循环终止判断时的方法调用

    stratTime = System.nanoTime();  
    for (int i = 0; i < list.size(); i++) {  
          
    }  
    endTime = System.nanoTime();  
    System.out.println("未优化list耗时:"+(endTime - stratTime));   

    应改为:

    stratTime = System.nanoTime();  
    int size = list.size();  
    for (int i = 0; i < size; i++) {  
          
    }  
    endTime = System.nanoTime();  
    System.out.println("优化list耗时:"+(endTime - stratTime)); 

    两者耗时对比:

    未优化list耗时:27375  
    优化list耗时:2444  

      list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替,优化前后的对比也很明显。

    异常捕获

    stratTime = System.nanoTime();  
    for (int i = 0; i < 10000000; i++) {  
        try {  
        } catch (Exception e) {  
        }  
    }  
    endTime = System.nanoTime();  
    System.out.println("在内部捕获异常耗时:"+(endTime - stratTime));

    应改为:

    stratTime = System.nanoTime();  
    try {  
        for (int i = 0; i < 10000000; i++) {  
        }  
    } catch (Exception e) {  
      
    }  
    endTime = System.nanoTime();  
    System.out.println("在外部捕获异常耗时:"+(endTime - stratTime)); 

    两者耗时对比:

    在内部捕获异常耗时:12150142  
    在外部捕获异常耗时:1955  

    大家都知道,捕获异常是很耗资源的,所以不要讲try catch放到循环内部,优化后同样有好几个数量级的提升。

  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/jingjiren/p/12966720.html
Copyright © 2011-2022 走看看