MST

星途 面试题库

面试题:JavaScript数组与迭代器的性能优化

给定一个非常大的数组(例如包含10万个随机整数),现在要对数组中的每个元素进行复杂的计算(例如计算其第n阶贝塞尔曲线坐标值)。请结合JavaScript的迭代器,设计一种性能优化的方案,说明如何避免频繁的内存分配和垃圾回收,提高计算效率。写出关键代码片段并阐述设计思路。
30.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 迭代器概念:JavaScript 的迭代器允许我们按需产生值,而不是一次性生成所有值,这样可以避免一次性将大量数据加载到内存中。
  2. 避免频繁内存分配:通过迭代器逐个处理数组元素,而不是一次性处理整个数组,减少同时存在于内存中的数据量。同时,复用对象和变量,避免在循环内部频繁创建新的对象或变量。
  3. 减少垃圾回收压力:由于内存中不会同时存在大量中间结果,垃圾回收的频率和压力会相应降低。

关键代码片段

// 模拟复杂计算函数,这里以简单函数代替计算第n阶贝塞尔曲线坐标值
function complexCalculation(num) {
    return num * num;
}

// 创建迭代器函数
function* arrayIterator(arr) {
    for (let i = 0; i < arr.length; i++) {
        yield arr[i];
    }
}

// 处理数据
function processData() {
    const largeArray = Array.from({ length: 100000 }, () => Math.floor(Math.random() * 100));
    const iterator = arrayIterator(largeArray);
    let result;
    for (let value of iterator) {
        // 复用 result 变量
        result = complexCalculation(value);
        // 这里可以对 result 进行进一步处理,例如存储到另一个数组或输出
        console.log(result);
    }
}

processData();

在上述代码中:

  1. arrayIterator 函数是一个生成器函数,它返回一个迭代器,该迭代器可以按需逐个产生数组元素。
  2. processData 函数中,我们先创建了一个包含10万个随机整数的数组,然后获取数组的迭代器。
  3. for...of 循环中,我们逐个获取迭代器的值并进行复杂计算,通过复用 result 变量减少了内存分配。这样就实现了性能优化,避免了频繁的内存分配和垃圾回收。