论坛首页 入门技术论坛

一道简单的面试题

浏览 29496 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-04-05  
wangzaixiang 写道
想起某位大师关软件优化的一段话:

1、编写代码时,不要进行优化。
2、如果没有给你带来麻烦,就不要优化。

说实在的,上面的代码,在99%的情况下,是不需要进行优化的。如果你的情况正好是那个1%,那么你



有道理,我觉得这个优化看上去很没有区别。

此外,是不是应该看看bytecode,编译器有没有自己帮你做优化呢??
0 请登录后投票
   发表时间:2010-04-05  
public static void testFor() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        
        for (; i <= 4; i++) 
            for (j = i; j <= 4; j++)
                for (k = j; k <= 4; k++) {
                    count++;
                }
        /*
            111
            112
            113
            114
            122
            123
            124
            133
            134
            144
            222
            223
            224
            233
            234
            244
            333
            334
            344
            444
         */
        System.out.println("first==" + count);
        
        count = 0;
        for (i = 1; i <= 10; i++) 
            for (j = 1; j <= 100; j++)
                for (k = 1; k <= 1000; k++)
                    count++;
        System.out.println("second==" + count);
    }



如果可以排除重复的结果的话,可以采用排列组合的思想。
0 请登录后投票
   发表时间:2010-04-05  
你们谁说的是对的啊!
0 请登录后投票
   发表时间:2010-04-05  
我认为:
1、特殊值不需要计算,比如=0,=1
2、最主要瓶颈的可能在log中,不管log输出到哪里,循环来上这么多次不行,要做缓冲。

crane.ding 写道
   前几天有位朋友跟我聊天说,最近他去面试遇到一个面试题,叫我帮他分析一下,是一道Java的面试题目;题目是这样的:请对以下的代码进行优化
原题代码如下
for (int i = 0; i < 1000; i++)
   for (int j = 0; j < 100; j++)
       for (int k = 0; k < 10; k++)
           log(i * j * k);

对于以上的代码,我给出了两个优化方案,优化一代码如下
for (int i = 0; i < 10; i++)
   for (int j = 0; j < 100; j++)
       for (int k = 0; k < 1000; k++)
           log(i * j * k);

优化二代码如下
int i, j, k;
for (i = 0; i < 10; i++)
   for (j = 0; j < 100; j++)
       for (k = 0; k < 1000; k++)
           log(i * j * k);

首先先来分析一下这三段代码,如下三个表
原题代码分析表
变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i1110001000
j100010001000 * 1001000 * 100
k1000 * 1001000 * 1001000 * 100 * 101000 * 100 * 10

优化一代码分析表
变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i111010
j101010 * 10010 * 100
k10 * 10010 * 10010 * 100 * 100010 * 100 * 1000

优化二代码分析表
变量实例化(次数)初始化(次数)比较(次数)自增(次数)
i111010
j11010 * 10010 * 100
k110 * 10010 * 100 * 100010 * 100 * 1000

    从以上三个表的分析看,优化一的性能和优化二比原代码性能好,其中优化二的性能是最好的。从而也可以说在以上的条件下,将大的循环放在内侧,小的循环放在外侧,其性能会提高;减少变量的实例化,其性能也会提高。对于以上的优化,如果在循环次数少的情况下,其运行出来的效果不大;而在循环次数较多的情况下,则其效果是比较明显的。
    以上是我自己对该题的一个优化和分析,如果大家有更好的优化方法或我又错误的地方,请大家多多指教。

0 请登录后投票
   发表时间:2010-04-05  
没感觉出有多大的优化.
0 请登录后投票
   发表时间:2010-04-05  
测试发现优化效果不是很大,也许Java中已经内部对循环进行了优化
0 请登录后投票
   发表时间:2010-04-05  
loga(MN)=logaM+logaN, 所以前面算过的结果可以保存
0 请登录后投票
   发表时间:2010-04-05  
呸。。。。

0 请登录后投票
   发表时间:2010-04-05   最后修改:2010-04-05
int ii = 1000, jj = 100, kk = 10, sum = ii * jj * kk, iii = 0, kkk = 0, jjj = 0;

	     for (ii = 0, jj = 0, kk = 0; kk < sum; kk++) {

		kkk = kk % 10;

		if (kkk == 0 && kk > 0) {
		    jj++;
		    jjj = jj % 100;
		    if (jjj == 0) {
			ii++;
			iii = ii%1000;
		     }
		}
                log(iii * jjj * kkk));
	      }


优化是这样做的,这是O(n) O(n3)的区别,n3 表示n的三次方.
0 请登录后投票
   发表时间:2010-04-05  
测试机器 CPU P8700 @ 2.53GHZ  MEMORY 2GB

public static void testFor0() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        long startTime = System.nanoTime();
        for (; i <= 100; i++) 
            for (j = 1; j <= 1000; j++)
                for (k = 1; k <= 10000; k++) {
                    count++;
                }
        System.out.println("zero count==" + count);
        long endTime = System.nanoTime();
        System.out.println("zero time==== " + (endTime - startTime));
    }
    
    public static void testFor1() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        long startTime = System.nanoTime();
        for (; i <= 10000; i++) 
            for (j = 1; j <= 1000; j++)
                for (k = 1; k <= 100; k++) {
                    count++;
                }
        System.out.println("first count==" + count);
        long endTime = System.nanoTime();
        System.out.println("first time==== " + (endTime - startTime));
    }
    
    public static void testFor2() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        long startTime = System.nanoTime();
        for (; i <= 100; i++) 
            for (j = i; j <= 1000; j++)
                for (k = j; k <= 10000; k++) {
                    count++;
                }
        System.out.println("second count==" + count);
        long endTime = System.nanoTime();
        System.out.println("second time==== " + (endTime - startTime));
    }
    
    public static void testFor3() {
        int ii = 10000, jj = 1000, kk = 100, sum = ii * jj * kk, iii = 0, kkk = 0, jjj = 0;  
        int count = 0;
        long startTime = System.nanoTime();
        for (ii = 0, jj = 0, kk = 0; kk < sum; kk++) {  
            kkk = kk % 100;  
            if (kkk == 0 && kk > 0) {  
                jj++;  
                jjj = jj % 1000;  
                if (jjj == 0) {  
                    ii++;  
                    iii = ii%10000;  
                }
            }
            count++;
        }
        System.out.println("third count==" + count);
        long endTime = System.nanoTime();
        System.out.println("third time==== " + (endTime - startTime));
    }



结果

zero count==1000000000
zero time==== 858950788
first count==1000000000
first time==== 941317961
second count==900711700
second time==== 756062573
third count==1000000000
third time==== 6520663101


    public static void testFor0() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        long startTime = System.nanoTime();
        for (; i <= 10; i++) 
            for (j = 1; j <= 100; j++)
                for (k = 1; k <= 1000; k++) {
                    count++;
                }
        System.out.println("zero count==" + count);
        long endTime = System.nanoTime();
        System.out.println("zero time==== " + (endTime - startTime));
    }
    
    public static void testFor1() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        long startTime = System.nanoTime();
        for (; i <= 1000; i++) 
            for (j = 1; j <= 100; j++)
                for (k = 1; k <= 10; k++) {
                    count++;
                }
        System.out.println("first count==" + count);
        long endTime = System.nanoTime();
        System.out.println("first time==== " + (endTime - startTime));
    }
    
    public static void testFor2() {
        int count = 0;
        int i = 1;
        int j = 1;
        int k = 1;
        long startTime = System.nanoTime();
        for (; i <= 10; i++) 
            for (j = i; j <= 100; j++)
                for (k = j; k <= 1000; k++) {
                    count++;
                }
        System.out.println("second count==" + count);
        long endTime = System.nanoTime();
        System.out.println("second time==== " + (endTime - startTime));
    }
    
    public static void testFor3() {
        int ii = 1000, jj = 100, kk = 10, sum = ii * jj * kk, iii = 0, kkk = 0, jjj = 0;  
        int count = 0;
        long startTime = System.nanoTime();
        for (ii = 0, jj = 0, kk = 0; kk < sum; kk++) {  
            kkk = kk % 10;  
            if (kkk == 0 && kk > 0) {  
                jj++;  
                jjj = jj % 100;  
                if (jjj == 0) {  
                    ii++;  
                    iii = ii%1000;  
                }
            }
            count++;
        }
        System.out.println("third count==" + count);
        long endTime = System.nanoTime();
        System.out.println("third time==== " + (endTime - startTime));
    }


结果
zero count==1000000
zero time==== 1811683
first count==1000000
first time==== 2361474
second count==905620
second time==== 2054730
third count==1000000
third time==== 7406249

大家看看结果吧。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics