又一个有趣的面试题
大家还记得前些天的那个火柴棍式的面试题吗?很有趣吧。下面是我今天在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 无删改 仅以此纪念陈皓(左耳朵耗子)
github.com/1chooo/refinaid 如图,抄我们代码的时候连注释都一起抄走了。 甚至是我们新版和旧版网站的缝合怪,新版 navbar 和背景,旧版标题和设计…
在一些关键接口增加前端加密,加密代码由服务端返回,代码混淆人类无法正常读取。这时候制作爬虫的一般会选择采用 eval 执行来获取加密后的参数,可以尝试在这段加密的代码中投毒,包…
猜测苹果用户有尝试安卓的意向买个安卓备用机因为备用机,所以找个性价比高的,比如红米之类但一分钱一分货,所谓的性价比机器本质上在一定程度上就是体验差对整个安卓失望,或者不够满足放…
合速度