又一个有趣的面试题
大家还记得前些天的那个火柴棍式的面试题吗?很有趣吧。下面是我今天在StackExchange上看到的一个有趣的面试题。大家不妨一起来思考一下。问题如下——
有两个相同功能代码如下,请在在A,B,C是什么的情况下,请给出三个原因case 1比case 2快,还有三个原因case 2会比case 1要执行的快。(不考虑编译器优化)
for (i=0; i<N; ++i){
A;
B;
C;
}
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也是其中一个因素。大家对底层知识了解的都很不错啊。赞一个。
转载于酷壳CoolShell 无删改 仅以此纪念陈皓(左耳朵耗子)
昨天装了一个 asahilinux ,然后又把 mac 分区彻底格了 ext4 ,但是想装一个 virtualbox 或者 vmware 都没有 arm 版,微信的 arm 版…
长江存储这么便宜 心动想搞个全闪存 nas 有推荐的型号吗 不需要 gpu 解码功能 当个纯 nas 就好 如果有云同步到 azure blob/aws s3 功能就更好了 …
直接给用户转账。。前后转账了 3200 了 然后打电话过来说贷款啥的。。有人遇到过吗?不知道是不是点击了啥泄露了信息 这相当于白赚 3200 吗 还是说这笔钱应该咋办呢 是通…