IT技术博客大学习 共学习 共进步

又一个有趣的面试题

酷壳 - CoolShell.cn 2011-04-02 13:46:33 浏览 4,323 次

大家还记得前些天的那个火柴棍式的面试题吗?很有趣吧。下面是我今天在StackExchange上看到的一个有趣的面试题。大家不妨一起来思考一下。问题如下――

有两个相同功能代码如下,请在在A,B,C是什么的情况下,请给出三个原因case 1比case 2快,还有三个原因case 2会比case 1要执行的快。(不考虑编译器优化)

case 1

for (i=0; i<N; ++i){
    A;
    B;
    C;
}

case 2

for (i=0; i<N; ++i){
    A;
}
for (i=0; i<N; ++i){
    B;
}
for (i=0; i<N; ++i){
    C;
}

我的第一个反应是――

  • case1 要快一些,因为只有一个i++的i<N的操作,而case 2却有三个,这在点上,case 1就比case 2要快。
  • case2如果要快的话,有一个原因是,A, B, C其中一个需要去先获得一个资源(比如一个锁),在case1下,每次都要去拿这个资源,而case2下,只需要拿一次然后。但这个可能是不对的,因为我无法想出一个相同的语句块放在case 1中会和放在case 2中有差别。(不过可能比较接近了)

继续思考:这个题有点像是“同步和异步”的问题,case 1是同步,case 2是异步,所以,异步快于同步,也许可以从这个方向出发,写出A, B, C的语句块。

不过,其要三个原因啊。各位,你们有想法吗

―-更新 1―-

刚才在twitter上与人讨论,发现又有一种情况,case 2要比case 1要快。比如,A, B, C分别访问是不同的内存块(数组),那么case 1就得在不同的内存块上来回切换寻址,而case2则可以连续地访问内存块。访问连续的内存效率要高。尤其是三块大内存。

―-更新 2―

正如本贴评论中所说的,CPU的cache也是其中一个因素。大家对底层知识了解的都很不错啊。赞一个。

建议继续学习

  1. MacBook Air与工作效率 (阅读 10,544)
  2. 几个内存相关面试题(c/c++) (阅读 9,262)
  3. 加班与效率 (阅读 6,023)
  4. MySQL vs NoSQL 效率与成本之争 (阅读 5,042)
  5. 冗余索引对查询效率的影响 (阅读 4,522)
  6. 良好的书写规范提高PHP代码执行效率 (阅读 3,424)
  7. 关于工作效率的心得分享 (阅读 3,383)
  8. 优化JavaScript的执行效率 (阅读 3,365)
  9. PHP 序列化与 .NET 中其它方式序列化的效率对比 (阅读 3,342)
  10. 前端开发,最好是多好? (阅读 3,120)