for循环嵌套优化

最近生成密码字典的时候遇到了多层for循环嵌套的问题,如下

for (int i = 0; i < 1000; i++)  
    for (int j = 0; j < 100; j++)  
        for (int k = 0; k < 10; k++)  
            testFunction (i, j, k);  
原代码耗时分析

循环变量在实例化、初始化、比较、自增等方面的耗时情况:

变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i1110001000
j100010001000 * 1001000 * 100
k1000 * 1001000 * 1001000 * 100 * 101000 * 100 * 10

(注:由于单次耗时视不同机器配置而不同,上表相关耗时采用处理的次数进行说明)
该代码的性能优化就是尽可能减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时,不能引进其它可能的运算耗时。

优化方案一

将大的循环放到内侧,小的循环放到外侧:

for (int i = 0; i < 10; i++)  
    for (int j = 0; j < 100; j++)  
        for (int k = 0; k < 1000; k++)  
            testFunction (k, j, i);  

耗时情况:

变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i111010
j101010 * 10010 * 100
k10 * 10010 * 10010 * 100 * 100010 * 100 * 1000
优化方案二

先声明变量(但在循环次数少的时候不明显,有时反倒会影响效率):

int i, j, k;  
for (i = 0; i < 10; i++)  
    for (j = 0; j < 100; j++)  
        for (k = 0; k < 1000; k++)  
            testFunction (k, j, i);  

耗时情况如下:

变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i111010
j11010 * 10010 * 100
k110 * 10010 * 100 * 100010 * 100 * 1000
优化效果测试
  1. 机器配置:Pentium(R) Dual-Core CPU E5400 @2.70GHz 2.70GHz, 2GB内存;
  2. 循环变量i、j、k循环次数分别为20、200、2000,进行5组测试。
public static void testFunction(int i, int j, int k) {  
        System.out.print("");   // 注:该方法不影响整体优化,这里只有简单输出  
    }  

    public static void testA() {  
        long start = System.nanoTime();  
        for (int i = 0; i < 1000; i++)  
            for (int j = 0; j < 100; j++)  
                for (int k = 0; k < 10; k++)  
                    testFunction(i, j, k);  
        System.out.println("testA time>>" + (System.nanoTime() - start));  
    }  

    public static void testB() {  
        long start = System.nanoTime();  
        for (int i = 0; i < 10; i++)  
            for (int j = 0; j < 100; j++)  
                for (int k = 0; k < 1000; k++)  
                    testFunction(k, j, i);  
        System.out.println("testB time>>" + (System.nanoTime() - start));  
    }  

    public static void testC() {  
        long start = System.nanoTime();  
        int i;  
        int j;  
        int k;  
        for (i = 0; i < 10; i++)  
            for (j = 0; j < 100; j++)  
                for (k = 0; k < 1000; k++)  
                    testFunction(k, j, i);  
        System.out.println("testC time>>" + (System.nanoTime() - start));  
}  

测试结果如下:

0第1组第2组第3组第4组第5组
原方案13553972031358978176135812828113501936821354786598
方案一13434827041348410388134397803713479191561340697793
方案二13424275281343897887134266246213421240481336266453

从上面的测试结果来看,优化后的方案基本符合我们的预期结果。

总结
  1. 大的循环放到内侧,小的循环放到外侧,确实能提高效率

  2. 声明变量,能提高效率,但在循环次数少的时候并不明显,有时反倒会影响效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值