MST

星途 面试题库

面试题:优化 JavaScript 类数组对象并发处理的性能

有一个非常大的类数组对象,其中每个元素都需要进行一个复杂的异步计算任务。请设计一个方案,在保证并发执行任务的同时,优化整体性能,避免因过多并发导致内存溢出或性能瓶颈。请详细阐述设计思路,并提供核心代码示例。
19.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 任务分割:将大的类数组对象分割成多个小的子数组,以减少单个任务处理的数据量。
  2. 并发控制:使用一个队列来管理任务,并设置最大并发数,避免同时执行过多任务导致内存溢出或性能瓶颈。
  3. 异步处理:利用 async/await 或者 Promise 来处理异步计算任务,确保代码的异步执行和顺序控制。

核心代码示例

// 模拟复杂的异步计算任务
function complexAsyncTask(data) {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve(data * 2); // 模拟计算结果
        }, 100);
    });
}

async function processLargeArray(largeArray, maxConcurrency) {
    const result = [];
    const taskQueue = [];
    const executeTask = async () => {
        const task = taskQueue.shift();
        if (task) {
            const res = await complexAsyncTask(task);
            result.push(res);
            executeTask();
        }
    };
    for (const item of largeArray) {
        taskQueue.push(item);
        if (taskQueue.length >= maxConcurrency) {
            await executeTask();
        }
    }
    // 处理剩余任务
    while (taskQueue.length > 0) {
        await executeTask();
    }
    return result;
}

// 使用示例
const largeArray = Array.from({ length: 1000 }, (_, i) => i + 1);
const maxConcurrency = 10;
processLargeArray(largeArray, maxConcurrency).then((res) => {
    console.log(res);
});

上述代码实现了对大数组的异步任务处理,通过控制并发数避免性能问题。具体解释如下:

  1. complexAsyncTask 函数模拟了复杂的异步计算任务。
  2. processLargeArray 函数接受大数组和最大并发数作为参数。
  3. 使用 taskQueue 来存储任务,executeTask 函数从队列中取出任务并执行,利用 async/await 确保任务顺序执行。
  4. 遍历大数组,将任务加入队列,当队列长度达到最大并发数时,执行任务直到队列长度小于最大并发数。
  5. 遍历结束后,处理队列中剩余的任务。
  6. 最后返回处理结果。