前几天去一外企面试,被问了个题,没答上来,发给大家看看

1 看代码


for(int i=0;i<100;i++){
// do some work
}

for(int i=100;i>0;i--){
// do some work
}


那个效率高 为什么?

2 一个页面上有5个大图片,如何提高这个页面的加载速度(注意 是整个页面的加载速度,不是指图片的迟加载)

诚心求教了

对于第1个问题,搜到这个页面:

[url=http://www.limodev.cn/blog/?p=631]i++循环与i--循环的执行效率[/url]

有点好奇的是这公司开发什么样的软件,需要如此细致的优化?如果只是在面试的时候才用到,那就是刁难楼主了~~~

第一题好像是第二个效率高,记得以前上学时买国外的数据结构书看时还在纳闷,为什么他们用i--,大学教材要用i++ 呢,呵呵,猜的。
不过二进制的减法记得好像要转化为加法来算。

javaeye网页上 右键
看看他的banner图片 怎么加载的。~~

第一题: 不会。 不应该有区别。
第二题: 把大图分成小图片。

这个真不会...

1.感觉应该是加法快吧...

2.切图?美工都这样处理大图片的....

第一个问题有意思

期待牛人回答

第二种快,记得JE里还有人发帖说过呢

是减的快`

在不同的语言中代价也不一样。

够细致啊,还以为搞C,汇编的才要那么深入呢

对于第2个问题,使用单独的服务器放图片,甚至使用多台服务器放图片,应该可以加快加载速度

1、第二种快,原因是i--比i++少执行一条cpu指令
2、把每个大图片分成10个小图片,并且这10个小图片的地址采用与当前html页面不同的域名链接地址。每个大图片分成的小图片的链接地址的域名都不同。

[quote="movingboy"]对于第1个问题,搜到这个页面:

[url=http://www.limodev.cn/blog/?p=631]i++循环与i--循环的执行效率[/url]

有点好奇的是这公司开发什么样的软件,需要如此细致的优化?如果只是在面试的时候才用到,那就是刁难楼主了~~~[/quote]
长见识了。。

第一个问题可是说是C的底层问题了。我觉得不是要编写编译器或者30年前的机器上跑的程序,根本不用考虑这种问题。少一条CPU指令增加的速度和代码阅读难度的上升效费比太低,根本不合算。
如果是要应聘C底层开发用这个题也算说得过去,毕竟这种开发需要对底层硬件实现有相当的了解。C语言最适合的地方就是操作系统内核、编译器等底层。C代码与其说是给程序员看的,不如说是给CPU和编译器看的。
如果是应聘Java开发,那么这个不是刁难人就是找题的是个250。不知道从哪里找个题,觉得比较偏就给写上了。Java虚拟机执行这个是和C一样吗?不同的Java虚拟机实现执行这个实现一样吗?也许Sun的+就快,IBM的-就快都是可能的。

学习了,一个有趣的问题

原来是 -- 快啊

第二个问题比较经典的, 可以把图片集成在一张大图里, 用js进行区域定位.

第2个问题
1、大图切割小很多小图,单独加载(看了楼上的回复知道的)
2、对于图片加载,可以使用分域名的方式,如
img1.aa.com/aa1.jpg
img2.aa.com/aa2.jpg
这种做法,这个浏览器的限制,同一域名下一次只发送两个请求(好像是IE的限制,其他的浏览器也有)。

第二个问题也可以用ajax的方式。当页面ready后,那几个图片才开始从网页下载

[quote="lixjluck"]第2个问题
1、大图切割小很多小图,单独加载(看了楼上的回复知道的)
2、对于图片加载,可以使用分域名的方式,如
img1.aa.com/aa1.jpg
img2.aa.com/aa2.jpg
这种做法,这个浏览器的限制,同一域名下一次只发送两个请求(好像是IE的限制,其他的浏览器也有)。

[/quote]

同意多个图片服务器存储 好像 网易或者新浪的相册就是这么处理的。

[quote="orte-001"][quote="lixjluck"]第2个问题
1、大图切割小很多小图,单独加载(看了楼上的回复知道的)
2、对于图片加载,可以使用分域名的方式,如
img1.aa.com/aa1.jpg
img2.aa.com/aa2.jpg
这种做法,这个浏览器的限制,同一域名下一次只发送两个请求(好像是IE的限制,其他的浏览器也有)。

[/quote]

同意多个图片服务器存储 好像 网易或者新浪的相册就是这么处理的。
[/quote]

恩,360buy也这么处理的,从FF状态栏可以看到

世界真奇妙啊!
学习下!

有趣的问题

第一个问题应该这样来回答:
第一种更快,理由是:我习惯使用第一种了,所以效率更高。
第二个问题应该是lixjluck回答的那样的:
[quote]
第2个问题
1、大图切割小很多小图,单独加载(看了楼上的回复知道的)
2、对于图片加载,可以使用分域名的方式,如
img1.aa.com/aa1.jpg
img2.aa.com/aa2.jpg
这种做法,这个浏览器的限制,同一域名下一次只发送两个请求(好像是IE的限制,其他的浏览器也有)。
[/quote]

for(int i=0;i<100;i++){

// do some work

}

for(int i=100;i>0;i--){

// do some work

}

i给的值太小了,根本不用考虑速度.

应该是 i-- 比较快 。

因为每次都在和 100 比较
和每次都和 0 比较,这是两个不同数量级的比较。

和0比较 只要判断他的 符号位就可以,
而和100比较 就要比较好多位了。

至于图片,单独的图片服务器会比较好。

感觉上面那些说忽略速度的童鞋 。

额,人家问自然有他的原因,

不说实际用不用的到,

但这个问题确实可以反映很多基础的东西。

我就不信到你面试的时候,你敢说这东西一点用没有

你这题目我拒绝回答。

第一个效率高,我觉得这考的是操作系统的页式存储的知识,即页的替换方式,因为主存的空间是有限的,

1.应该是i--快,感觉
2.原则也是大图分割成小图!

  1. i--肯定快,少数据量下差不多,大数据量就体现出来了。
  2. 将大图合成1张图,减少HTTP链接数

对于第一题我觉得是第二种用法(也就是--)效率要高:首先i++跟i--的效率应该是一样的,两者的主要区别是:每次循环中i若是跟0进行比较,在系统底层只需判断i的二进制表示的第一位是0还是1(数字的二进制的第一位代表了正负),而跟100进行比较的话底层实现肯定要比较多个位才能得出结果。

那个图的解决办法是不是抄袭我的设计, 我曾经设计过这个apache mod 来解决整体加载速度问题。 

第二个还得增加浏览器的线程数。

恩,第一个问题学到知识了

第一个问题,i--快,和0比较与100比较效率高
第二个问题,两种选择,第一还是五张图片,但是需要请求不同的图片服务器,第二是把五张图片合成一张图片,然后用脚本定位

第一个问题
i=100 1000 10000时的运行时间

i-- i++
0 16
15 47
94 156

实践证明是i--效率高,不过不知道其中的原因,请知道的人分享一下啊,也增长一下知识。

循环肯定是第二个高啊,在循环都是被编译器翻译成第二种形式,而且寄存器比前一个少一个,指令少一条,具体你可以看看《深入理解计算机系统》第3章里面有讲到。

[b]把问题扩大化了一下[/b]

public static void main(String[] args) {

    Long aa= System.currentTimeMillis();
    for(int i=0;i<100000000;i++){   
          // do some work   
        }   

    Long bb  = System.currentTimeMillis();

    System.out.println(">>>>>>"+(bb-aa));

    Long cc= System.currentTimeMillis();
    for(int i=100000000;i>0;i--){   
          // do some work   
        } 
    Long dd  = System.currentTimeMillis();
    System.out.println(">>>>>>"+(dd-cc));
}

结果第一个输出的是>>>>>172
第二个输出的是>>>>>109
具体为什么,我也不太清楚,希望高手给个具体的回答。

长见识,都是牛人啊!

:( 还没考虑过是用+快,还是-快额。

这个要是回答 我肯定就是说加法快了 根据数学的角度来看 减法是要转换成加法在去做运算的 计算机也是这样的 所以加法的会快 这个是个人看法

第二个我不太清楚了

[quote]对于第1个问题,搜到这个页面:

i++循环与i--循环的执行效率

有点好奇的是这公司开发什么样的软件,需要如此细致的优化?如果只是在面试的时候才用到,那就是刁难楼主了~~~[/quote]

确实 可以。 呵呵

大于小于是先做减法再看符号位, i>0的每次循环少做一次减法,

java出这题纯属sb

[b]问题一:[/b]
i--循环
每次循环判断的时候只要使用一条非零跳转指令(BNE)即可
而i++的话则需要两条指令:比较(CMP) 小于跳转(BLE)
显然前者优于后者。
不过对于现在的机器来说,这点指令所带来的程序执行效率已经可以忽略不计了。

[b]问题二:[/b]
切割图片.楼上的人已经说了.个人认为这个方法比较实用.暂想不出更好的了.

把图片合并,用CSS的position来取得所要的图,主要是让图片一次性DOWN下来,提高效率。

如果要遍历一个排序结果(已经拍好序)的话我觉得还是+快,你们距地呢?

如果给出的不是0是一个负数结果会怎么样啊?

1、加法快,因为二进制内加法可以运算,而减法有个转换成补码再进行加法的操作。所以i++相对快点
2、切小图

第一题,是要看你做什么业务而定
第二题是看你页面用什么技术php,jsp,asp,html速度都不同
但是最终还是html,html又分div,table两种速度又不同

第一个问题:应该是第一个,在二进制里减法好像要比加法复杂一点
第二个问题:将大图片分割成多个小图片,记得看过什么电视,将一个庞大的数据,分割成无数个很小的数据包,上传的速度相当的快。这个原理也差不多

[url][/url]

关于for的问题, 这2个是一样快的。

变成汇编语言,所用到的指令如下

1
i++ -> inc
i-- -> dec
inc 和dec 没什么区别

2
关于比较, 80x86 能运行 java 的,x 只是也是5 以上了 所以比较指令是test
和100 比 与 和0 比较都是用同样的指令 test 所以没什么区别

如果钻牛角尖, x 小于3 (80286, 8088)等
没有test 指令, 只能有sub (减法指令)
这这种情况下 2者也是一样的

  • 100 变成 加上100的补码 (没错, 计算机只会做加法的)

3, 关于跳转, 都是用的jmp jmp 是根据状态寄存器来判断是否跳转的, test 也好 sub也好, 都会置状态寄存器的, 所以也没有区别!

我还真测了一下

[code="java"] long s1 = System.currentTimeMillis();
for(int i=0;i<1000000000;i++){
}
long e1 = System.currentTimeMillis();

    long s2 = System.currentTimeMillis();
    for(int i=1000000000;i>0;i--){
    }
    long e2 = System.currentTimeMillis();
    System.out.println(e1-s1);
    System.out.println(e2-s2);[/code]

3360
5671
不知道跟jvm有没有关系

1.第二种快,i0判断起来慢。
2.大图片变成小图片,一个个加载

for(int i=0;i<100;i++){

i初值为0,要很多次增长数位,要一次次申请内存空间。
}

for(int i=100;i>0;i--){

i初值为100,一次申请的空间已经足够,不需要一直申请内存。
}

第一道题,我感觉是
1 效率高, 回去测试明天给您答案!
第二道题
在photoshop中用切片工具切割成小块, 另存为web ,将会生成一个html网页,
只要将您的图片和html文件路径安排好就解决问题了!

第一题:
如果像和你的题目所述,时间上基本没有差别。
1.循环次数太少了,
2.循环体没有执行什么动作。
如果达做到能区分效率的程序,那么,肯定是递减的那个效率高。
第二种平均比第一种快50%左右。
第二题:
把大图片切成小图片的做法不一定行得通。
因为把一个大图片切成几个小图片,那么客户端势必与服务器多了几次请求的时间。
但大图片加载速度又比较慢,这就可以一个与多个之间找个平衡点了。
另一个种就是尽量在不影响图片的质量的前提下减少图片的SIZE,这也是可行。
如,一般GIF就比JPG小咯
一点想法而已。呵呵

今天去问了一下boss,这是第一题的正确答案

for(int i=0;i<100;i++){

i初值为0,要很多次增长数位,要一次次申请内存空间。
/t 要多次等待虚拟机的分配内存
}

for(int i=100;i>0;i--){

i初值为100,一次申请的空间已经足够,不需要一直申请内存。
只需一次申请!
}

一个都不会 呵呵 回帖看是怎么个意思

完全小题大作,跟业务联系起来才有意义

肯定是第一个执行效率高哦 当执行减法的时候,它会转换成加法,这样就需要浪费一部分内存。。第二个可以用ajax的一部交互。当执行页面的图片的时候,不会影响页面加载其他的东西。。

这个是没有本质区别的