计算机这玩意儿,跟咱们吃汤喝饭一样,每天抬头不见低头见,总得有个固定的“底座”。

要是没这个底座,再豪华的盘子也得塌。咱们得先明白,寄存器就是那个装着泡面汤的碗,CPU 就是那个炒菜的人,内存就是那堆备菜的架子。 大量人一上来就盯着指令集,认定高 MIPS 就是强,实际上那是用错了单位。MIPS 是速度单位,MHz 才是频率单位。你买手机,|sys| 的数值越大,说明参数越“对”,也就是指令种类多,能写的代码越花哨,但这跟手机跑多快没关系。就像你开法拉利,|sys| 可能是 800,但你发动机转速只有 8000,那就跑得慢。真正的耗电大户是频率,你看到手机广告里那个 8000 的 Hz,别光盯着大,要看它占了多少参数,参数少意味着它一次能跑得更多。 还有那个字长,大量人被忽悠着要用 64 位的,那是为了存大数据,跟性能提升 1.5 倍有啥两样?机器是按位数算的,不是按字节算的。16 位机器一次能存 32 位,24 位一次能存 64 位。

要是你非要塞进 64 位的数据,那数据就会溢出,就像你试图把一箱水泥码到一个纸箱里,结局箱子破了。性能提升,就是让 CPU 一次能处理更多的数据,要么让同一个数据跑得更快。

比方说,16 位浮点除法,要是是按字长算,那 24 位的机器效率可能只是提升 1.5 倍,但要是按精度算,24 位的浮点除法效率可能提升 3 倍。数字越大,精度越高,变量范围越广,内存越大,但这不代表它跑得越快。 再看看逻辑管住单元,这玩意儿全是门电路,全是开关。你假设它是纯逻辑的,理想状态下,它能并行处理 n 个操作,一次把 n 个数据从 0 变成 1。

可是现实的门电路,有延迟,有寄生电容,还有功耗。

那一次处理 1000 个数据,可能需求 1000 毫秒,那延迟就得除以 1000。

这时候,精度就成了拍板性因素。16 位机器延迟除以 1000 是 16 秒,24 位除以 1000 是 1.6 秒。

难道 16 位的机器就慢 10 倍?不是,是它更稳定。就像两个人跑步,一个用 16 英寸的轮胎,一个用 24 英寸的轮胎,别看 24 英寸跑得快,但那个 16 英寸的轮胎可能更结实,不好办炸。 还有那些缓存,别只想着 Cache 是加速器。Cache 的本质是啥?是先把常用的数据先放进自己肚子里,省工夫。但缓存也是有失确实。当数据被写入或读出时,要是它比 Cache 小,那就只能是丢。就像你进超市,橱窗里放的是 1 元钱的塑料袋,你拿走了,那个位置就空了。你忘带钱的,再进去拿个 100 元的袋子,结局你忘带钱了,只能走。

这就是 Cache 丢失。别当作 Cache 就是无限的,它容量有限,得精打细算。

要是程序每次都要去原机内存里找数据,那速度就跟没装缓存的机器一样,那就是原速,那缓存的性价比就低了。 再聊聊总线带宽。总线就是高速公路,数据就是卡车。车的数量越多,速度越快。假设你有一路 4 位的总线和一路 8 位的总线,那 8 位的总带宽是 4 位的 2 倍。

这意味着同样的速度下,8 位的总带宽是 4 位的 2 倍。但要是有 4 条 8 位的总线,那带宽就翻倍了,再就是 4 倍。

这就是带宽,不是容量。容量是存多少数据,带宽是传多快的数据。

故此,总带宽越高,内存读写越快。 还有指令长度。指令是不是越长越好?不是。指令忒长,就得把寄存器操作分开,那延迟就增添了。就像做菜,把切菜、炒菜、装盘都写在一条指令上,那厨师就得与此同时做三件事,效率反而低了。

那是流水线,把任务分块。指令忒短,每次只能操作一点点,那响应就是慢。就像点外卖,你每次只能点一行菜,那等出来的工夫就多了。指令长度,就是折中,尽量让一条指令能处理多个数据,与此同时不让操作拖得忒久。 最终是内存访问工夫。内存能不能被直接读取?不能。物理上的内存,跟寄存器不一样。寄存器是管子里的,内存是卡槽里的。要把数据从卡槽里读出来,得经过读写电路,这就得延迟。延迟越多,速度越慢。

故此别想着用寄存器替代内存,那得先把数据从卡槽读出来才算数。 总结下来,性能提升不是单一维度的。别只盯着那个 MIPS 数字,也别只盯着那几位数的 Cache。要看那条总线能不能撑住,要看指令能不能分块,要看延迟能不能被抵消。

有时候,增添指令长度反而能提升性能,有时候,增添 Cache 的容量反而可能掉速。计算机这玩意儿,是个平衡的艺术。