循环中频繁计算复杂表达式如何用惰性求值优化?
最近在处理一个大数据列表渲染时发现性能卡顿,每次循环都要执行Math.sqrt(item.value * (item.value + 1))这样的计算。我尝试把计算结果存到变量里放到循环外面,但发现数据依赖项里的索引变量导致结果错乱:
for (let i = 0; i < data.length; i++) {
const val = Math.sqrt(data[i].value * (data[i].value + 1));
// 这里用val做渲染...
}
后来改成提前计算所有值的缓存数组,但发现初始渲染时计算量反而更大。有没有更好的惰性求值方式,既能延迟计算又不丢失上下文关联?
可以用下面这种方式:
这样做的好处是,每次只计算当前需要的值,不会一次性把所有数据都算出来,减少了初始渲染时的压力。而且生成器会自动记住上次的状态,不用担心上下文关联的问题。
如果你不想用生成器,还可以考虑用
map结合闭包的方式,效果类似,代码也会更简洁一些。不过生成器在这类场景下会更灵活一点。