时间切片的实现和调度(原创2.6万字) (7)

Generator 必须将每个函数都包装在 Generator 堆栈中。这不仅增加了很多语法开销,而且还增加了现有实现中的运行时开销。虽然有胜于无,但是性能问题仍然存在。

最大的原因是生成器是有状态的。无法在其中途恢复。如果你要恢复递归现场,可能需要从头开始, 恢复到之前的调用栈。

时间切片为什么不使用 Web Workers

是否可以通过 Web Worker 来创建多线程环境来实现时间切片呢?

React 团队也曾经考虑过,尝试提出共享的不可变持久数据结构,尝试了自定义 VM 调整等,但是 JavaScript 该语言不适用于此。

因为可变的共享运行时(例如原型),生态系统还没有做好准备,因为你必须跨工作人员重复代码加载和模块初始化。如果垃圾回收器必须是线程安全的,则它们的效率不如当前高效,并且VM实现者似乎不愿意承担持久数据结构的实现成本。共享的可变类型数组似乎正在发展,但是在当今的生态系统中,要求所有数据通过此层似乎是不可行的。代码库的不同部分之间的人为边界也无法很好地工作,并且会带来不必要的摩擦。即使那样,你仍然有很多JS代码(例如实用程序库)必须在工作人员之间复制。这会导致启动时间和内存开销变慢。因此,是的,在我们可以定位诸如Web Assembly之类的东西之前,线程可能是不可能的。

你无法安全地中止后台线程。中止和重启线程并不是很便宜。在许多语言中,它也不安全,因为你可能处于一些懒惰的初始化工作之中。即使它被有效地中断了,你也必须继续在它上面花费CPU周期。

另一个限制是,由于无法立即中止线程,因此无法确定两个线程是否同时处理同一组件。这导致了一些限制,例如无法支持有状态的类实例(如React.Component)。线程不能只记住你在一个线程中完成的部分工作并在另一个线程中重复使用。

ps: 本菜不会用 React,第一次读 React 源码,对源码有误读请指正

最后

觉得有用的请点个赞

本文内容出自 https://github.com/zhongmeizhi/FED-note

欢迎关注公众号「前端进阶课」认真学前端,一起进阶。回复 全栈 或 Vue 有好礼相送哦

时间切片的实现和调度(原创2.6万字)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfxjf.html