前几天面某公司,面试官问了一个很有意思的题:
while true: i++;
问1秒内这个i大概可以加几次。
感觉跟CPU的频率和指令优化有关系,有大佬能讲解一下嘛
前几天面某公司,面试官问了一个很有意思的题:
while true: i++;
问1秒内这个i大概可以加几次。
感觉跟CPU的频率和指令优化有关系,有大佬能讲解一下嘛
啥公司
这么问的话,我这么解释<对应的汇编如下>:
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,需要你把这句代码 翻译成 汇编
有没有可能出现溢出的情况。。
反正 就 64bit 一直加,溢出不溢出,不需要关注,反正 x0 只能存贮那么多,哈哈
如果考虑溢出的话的,代码就没法写了,i 可以是无穷大了
开放性问题。如果i没有被使用,可能被编译器优化了,一次也没执行
脉脉上是你问题吗? 看到个类似的,问的是i能被加到多少
梦回《计算机体系结构 量化方法》
这压根是死循环…目前的编译器,基本不会优化掉的
编译器知道循环是死循环,假如这个变量不在其他地方读取是可能被优化的,但加了volatile就不会了(测试于gcc11)
我也觉得这应该是个开放的问题。下面的条件可能也会有影响:
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
另外一种情况是个死循环,这个代码被优化掉或者APP崩溃。
以前的老电脑跑这段代码电脑直接死机、后面做了优化要么把代码优化掉,要么跑一段时间终止进程。
太高深了
666,学习到了。我首先考虑的是多久才能死机呢。