一道简单的面试题

前几天有位朋友跟我聊天说,最近他去面试遇到一个面试题,叫我帮他分析一下,是一道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);

首先先来分析一下这三段代码,如下三个表
原题代码分析表
[table]
|变量|实例化(次数)|初始化(次数)|比较(次数)|自增(次数)|
|i|1|1|1000|1000|
|j|1000|1000|1000 * 100|1000 * 100|
|k|1000 * 100|1000 * 100|1000 * 100 * 10|1000 * 100 * 10|
[/table]
优化一代码分析表
[table]
|变量|实例化(次数)|初始化(次数)|比较(次数)|自增(次数)|
|i|1|1|10|10|
|j|10|10|10 * 100|10 * 100|
|k|10 * 100|10 * 100|10 * 100 * 1000|10 * 100 * 1000|
[/table]
优化二代码分析表
[table]
|变量|实例化(次数)|初始化(次数)|比较(次数)|自增(次数)|
|i|1|1|10|10|
|j|1|10|10 * 100|10 * 100|
|k|1|10 * 100|10 * 100 * 1000|10 * 100 * 1000|
[/table]
从以上三个表的分析看,优化一的性能和优化二比原代码性能好,其中优化二的性能是最好的。从而也可以说在以上的条件下,将大的循环放在内侧,小的循环放在外侧,其性能会提高;减少变量的实例化,其性能也会提高。对于以上的优化,如果在循环次数少的情况下,其运行出来的效果不大;而在循环次数较多的情况下,则其效果是比较明显的。
以上是我自己对该题的一个优化和分析,如果大家有更好的优化方法或我又错误的地方,请大家多多指教。
展开阅读全文

没有更多推荐了,返回首页