字体
大
中
小
关灯
上一页 回目录    收藏 下一页

第89章 七千万次的小石头(5/8)

真正拖慢整个复杂系统的,从来都不是偶尔出现的大山,而是每天必须被搬运七千万次的小石头。

写完这句话,他停顿了一下。

为了让将来可能接手这份审计报告的平庸工程师也能看懂,他又补了一段更通俗的解释。

一次给五张试卷按分数从高到低排序,对任何人都不难。

难的是,系统要求你一天之内,把给五张试卷排序这个动作,重复七千万次。

标准库里的排序算法在计算机科学上被证明是非常优秀的。

但它们优秀的前提是通用。

标准库就像是一套占地几万平方米的大型自动化物流分拣中心。

它可以处理一万张试卷。

可以处理一百万个包裹。

可以处理带有各种奇怪对象的复杂数据结构。

它强大,通用,绝对可靠。

但如果你的流水线上,每次送过来的永远只有五个小包裹,而且每天要送七千万次。

那么,你每一次都去启动那套耗电巨大的大型物流中心,让传送带空转,让机械臂寻址,去执行庞大的分拣逻辑,

这就是不可饶恕的浪费。

在底层代码的视角里,这种浪费体现为,为了通用性而保留的复杂的函数调用开销。

为了处理多态而进行的动态类型检查。

为了兼容不同数组长度,标准流程里保留了大量条件分支。

而这些分支一旦在热点循环里反复触发,就会拖慢现代cpU最依赖的指令流水线。

事实上,并不是系统不会排。

而是流程太重了。

重到cpU的每一个时钟周期都在被无意义的管理逻辑消耗。

江临现在要做的,不是去推翻高德纳在《计算机程序设计艺术》里写下的经典排序理论,也不是发明什么震惊世界的新算法。

他只是需要一套固定手势。

五张试卷。

看第一张和第二张。

谁大谁在前面,该换就换。

再看第三张和第四张。

该换就换。

几步极其固定的比较之后,顺序自然就出来了。

不问多余的类型问题。

不打开多余的内存分配流程。

不为那根本不存在的一百万张试卷准备任何冗余的边界检查工具。

没有数据相关的循环,没有运行时临时选择路径。

比较顺序在编译前就被钉死,剩下的只是固定位置之间的比较与交换。

只处理这五个位置的数字。
本章未完,请翻下一页继续阅读.........
上一页 回目录    收藏 下一页