锁定老帖子 主题:一道简单的面试题
该帖已经被评为新手帖
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-04-05
wangzaixiang 写道 想起某位大师关软件优化的一段话:
1、编写代码时,不要进行优化。 2、如果没有给你带来麻烦,就不要优化。 说实在的,上面的代码,在99%的情况下,是不需要进行优化的。如果你的情况正好是那个1%,那么你 有道理,我觉得这个优化看上去很没有区别。 此外,是不是应该看看bytecode,编译器有没有自己帮你做优化呢?? |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间: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); } 如果可以排除重复的结果的话,可以采用排列组合的思想。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-04-05
你们谁说的是对的啊!
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间: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); 首先先来分析一下这三段代码,如下三个表 原题代码分析表
优化一代码分析表
优化二代码分析表
从以上三个表的分析看,优化一的性能和优化二比原代码性能好,其中优化二的性能是最好的。从而也可以说在以上的条件下,将大的循环放在内侧,小的循环放在外侧,其性能会提高;减少变量的实例化,其性能也会提高。对于以上的优化,如果在循环次数少的情况下,其运行出来的效果不大;而在循环次数较多的情况下,则其效果是比较明显的。 以上是我自己对该题的一个优化和分析,如果大家有更好的优化方法或我又错误的地方,请大家多多指教。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-04-05
没感觉出有多大的优化.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-04-05
测试发现优化效果不是很大,也许Java中已经内部对循环进行了优化
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-04-05
loga(MN)=logaM+logaN, 所以前面算过的结果可以保存
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2010-04-05
呸。。。。
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间: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的三次方. |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间: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 大家看看结果吧。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||