如何解决同步生成器的每个 `yield` 是否都不可避免地分配一个新的 `{value, done}` 对象?
MDN 说:
yield 关键字导致调用生成器的 next() 方法返回一个具有两个属性的 IteratorResult 对象:value 和 done。 value属性是yield表达式求值的结果,done为false,表示生成器函数还没有完全完成。
我在 Chrome 91.0.4472.77 中运行了一个测试,它似乎每次都是一个新对象。如果处理是细粒度的(大量迭代,每次计算量低),这似乎非常浪费。为了避免不可预测的吞吐量和 GC 卡顿,这是不可取的。
为了避免这种情况,我可以定义一个迭代器函数,在那里我可以控制(确保)每个 {value,done}
对 next()
对象的重用,从而导致属性值就地修改,即。没有为新的 {value,done}
对象分配内存。
我是否遗漏了什么,或者生成器是否具有这种固有的产生垃圾的性质?如果我所做的只是 {value,done}
即,哪些浏览器足够聪明,不会分配新的 const {value,done} = generatorObject.next();
对象。我不可能获得对象的句柄,即。引擎没有理由分配一个新对象?
解决方法
ECMAScript 规范要求生成器为每个 yield 分配一个新对象,因此所有兼容的 JS 引擎都必须这样做。
如果可以证明程序的可观察行为不会因为这种优化而改变,那么理论上 JS 引擎可以重用生成器的结果对象,例如当生成器的唯一用途是在 { {1}} 语句。但是,我不知道有任何引擎(至少在流行的 Web 浏览器中使用的引擎)会执行此操作。像这样的优化在 JavaScript 中是一个非常困难的问题,因为它是动态的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。