面试被问懵了

前几天面某公司,面试官问了一个很有意思的题:

while true: i++;

问1秒内这个i大概可以加几次。 :face_with_monocle:

感觉跟CPU的频率和指令优化有关系,有大佬能讲解一下嘛

2 Likes

啥公司

这么问的话,我这么解释<对应的汇编如下>:

loop_lable:
add x0,x0,0x1
b loop_lable

执行代码的快慢由CPU性能决定,cpu主频是衡量cpu快慢的主要参数.我电脑是3.2GHZ,就是说CPU上面的晶振频率是3.2Ghz,处理一条单一动作的时间是 1s/3.2Ghz = 0.3125 纳秒
一共2句汇编代码,

总的次数,就是你 cpu 频率的一半。<如果我想不起来主频,我就说,cpu硬件性能,哈哈,具体啥名字,到时候去baidu>

问的意思大概是:
1,需要了解cpu主频的概念
2,需要你把这句代码 翻译成 汇编

3 Likes

:thinking: 有没有可能出现溢出的情况。。

反正 就 64bit 一直加,溢出不溢出,不需要关注,反正 x0 只能存贮那么多,哈哈
如果考虑溢出的话的,代码就没法写了,i 可以是无穷大了

开放性问题。如果i没有被使用,可能被编译器优化了,一次也没执行

脉脉上是你问题吗? 看到个类似的,问的是i能被加到多少

梦回《计算机体系结构 量化方法》 :face_with_monocle:

这压根是死循环…目前的编译器,基本不会优化掉的

1 Like

编译器知道循环是死循环,假如这个变量不在其他地方读取是可能被优化的,但加了volatile就不会了(测试于gcc11)

1 Like

我也觉得这应该是个开放的问题。下面的条件可能也会有影响:

  • i是全局变量。全局变量的话要不要考虑同步问题。
  • 编译器优化,比如常见的循环展开。用上面大佬的例子,如果代码编译成下面这样,就能快很多:
loop_label:
add x0,x0,0x1
...
add x0,x0,0x1
b loop_label