面试被问懵了

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

while true: i++;

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

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

2 个赞

啥公司

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

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 个赞

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

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

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

1 个赞

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

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

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

1 个赞

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

1 个赞

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

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

加几次是操作系统决定的,操作系统的分时复用,如果所有资源都用在这个任务上那就看汇编指令条数,单指令、复合指令执行时间都是固定的,主频分之一或分之二或四。

51 主频12m
一个机器周期:1us

STM32 主频24m

一个时钟周期:1/24m us
一个机器周期:12/24m=0.5us

单机器周期:加、减 0.5us
双机器周期:移动、判断、其他三字节指令 1us
四机器周期:乘、除指令 2us

单指令:一个机器周期 0.5us
复合指令:两个、四个机器周期,1us、2us

1 个赞

另外一种情况是个死循环,这个代码被优化掉或者APP崩溃。

以前的老电脑跑这段代码电脑直接死机、后面做了优化要么把代码优化掉,要么跑一段时间终止进程。

:exploding_head:
太高深了

666,学习到了。我首先考虑的是多久才能死机呢。