中间层思想优化任务执行流程

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,“往前来”就可以让师傅快点下班了。

但如果中间层被塞满了,比如说食堂被占慢了,或者物理内存满栈了,那中间层就相当于没有了。


此方悬停
相册 小说 Ai