All problems in computer science can be solved by another level of indirection.
这是一句著名的话,计算机科学任何问题都可以通过多加一层抽象层来解决。
今天中午吃午饭的时候,吃完了排队放盘子,听到收盘子的师傅不停说着:“往前来往前来!”
我感觉不太对劲,盛饭的阿姨说“往前来”可以早点盛完饭休息,刷桌子的阿姨也可以催(当然没有)“快点吃”来早点刷完桌子。但收盘子的师傅喊“往前来”真能加快速度吗?
应该是不能的,只要学生吃完饭的时间没有提前,收盘子结束的时间不会有多大改变。
那是什么产生这样的结果呢?是学生吃完饭后需要起身在空地排队等候,这时候空出的位置就可以留给其他学生。因为食堂空间很大,收盘子速度比盛饭和吃饭要快的多,因而排队的停滞不会影响到前面的流程。
想必你已经明白了。这里食堂落脚的地方就是一个吃饭到收盘子的中间层。我们过去优化代码常常想删去不必要的消耗,但有时候多加一层中间层可以优化流程。
举例子,比如我们建立一个流式进行的队列
let 有人正在放盘子=false;
if(吃完饭了){
if(!有人正在放盘子){
放盘子();
}else{
wait();
}
}
这就建立了一个锁,只有在前方没有人放盘子了,张三才能起身放盘子
事实上的食堂代码是
let 排队的人=[];
if(this.吃完饭了){
排队的人.push(this);
}
与此同时,另一边:
排队的人.shift.放盘子();//队列最前面的人放了盘子离开
这就很方便了,张三起身加入队列等待,后续的人可以坐到椅子上享受(并非享受)午餐了。
事实上计算机的物理内存也可以看作一个巨大的食堂,命令的执行会把改变的值放回原位,不是等待传送给下一个需要此值的命令,而是下一个命令自己来读取。
我们为了避免无谓的进程消耗,应该对代码进行合理的优化。比如就像这种中间层,使用与前面任务执行快而后面任务执行慢,才会起到明显加快速度作用。还是拿食堂举例,如果学生们吃饭巨快但是放盘子要一边放一边跳卡拉OK,“往前来”就可以让师傅快点下班了。
但如果中间层被塞满了,比如说食堂被占慢了,或者物理内存满栈了,那中间层就相当于没有了。
此方悬停