【发布时间】:2017-10-31 02:58:52
【问题描述】:
永久挂起的函数生成器是否有性能成本?
例如,下面的代码将不断地yield 值,直到达到for 循环中d 的值。
出于问题的目的,我们有意阻止生成器达到done 的状态。这样做有资源成本吗?当然,理论上很容易向生成器表明我们实际上是done,但这有关系吗?为什么不让它永远挂起,直到它需要再次使用?
var fruits = ['apple', 'pear', 'strawberry']
function* fruitGenerator(items) {
var numberOfItems = items.length
var i = 0
while (true) {
yield items[i]
i++
if (i === numberOfItems) {
i = 0
}
}
}
var multipleFruits = fruitGenerator(fruits)
for (var d = 0 ; d < 10; d++) {
console.log(multipleFruits.next())
}
出于所有意图和目的,让我们假设对于这个示例,我不能使用常规的 for 循环。
【问题讨论】:
-
“出于所有意图和目的,让我们假设对于此示例” - 不是“对于 this 示例”与“ 所有意图和目的”?无论如何,如果调用次数不多,任何生成器函数可能永远不会完成,即使它没有被故意编码为无限循环 - 我不认为这是一个问题。
-
我不确定您所说的“性能成本”是什么意思。内存大小,速度?与什么相比 - 结束并重新实例化生成器?
-
性能成本是指内存大小和速度。它的生成器功能是否与标准
for循环一样快?还是比forEach慢吗?暂停的生成器在等待重新调用时是否存储在内存中?如果需要,结束生成器并稍后重新实例化是否更节省内存? -
@Modermo 当你周围有很多挂起的生成器对象时,它们确实会消耗额外的内存。但用完的发电机也是如此。没有区别。并且只要没有指向生成器的引用,它就会像任何其他对象一样被 GC,无论它是耗尽还是挂起。
标签: javascript function generator