MST

星途 面试题库

面试题:JavaScript 中如何在 Node 工作线程中优化基本数据处理操作以提升执行效率

在 Node.js 中使用工作线程时,假设有一个数组需要进行复杂的数学计算操作(如求每个元素的平方后再求和),请描述如何利用工作线程提升效率,并写出关键代码片段来实现。
39.5万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

1. 描述利用工作线程提升效率的方法

在 Node.js 中,主线程是单线程执行的,对于复杂的计算操作会阻塞事件循环,导致性能问题。工作线程允许我们将计算密集型任务分配到独立的线程中执行,这样主线程可以继续处理其他任务,从而提升整体效率。具体到对数组进行复杂数学计算(如求每个元素平方后再求和),可以将数组分割成多个部分,每个工作线程处理一部分,最后将各个部分的计算结果汇总得到最终结果。

2. 关键代码片段实现

const { Worker } = require('worker_threads');
const { performance } = require('perf_hooks');

// 待计算的数组
const largeArray = Array.from({ length: 1000000 }, (_, i) => i + 1);

// 分割数组为多个部分
const numWorkers = 4;
const chunkSize = Math.ceil(largeArray.length / numWorkers);
const chunks = [];
for (let i = 0; i < numWorkers; i++) {
    const start = i * chunkSize;
    const end = Math.min((i + 1) * chunkSize, largeArray.length);
    chunks.push(largeArray.slice(start, end));
}

// 工作线程计算逻辑
const workerPromises = chunks.map((chunk) => {
    return new Promise((resolve, reject) => {
        const worker = new Worker(`
            const { parentPort } = require('worker_threads');
            const chunk = ${JSON.stringify(chunk)};
            let sum = 0;
            for (let num of chunk) {
                sum += num * num;
            }
            parentPort.postMessage(sum);
        `);

        worker.on('message', (result) => {
            resolve(result);
            worker.terminate();
        });

        worker.on('error', (err) => {
            reject(err);
            worker.terminate();
        });
    });
});

const start = performance.now();
Promise.all(workerPromises)
   .then((results) => {
        const totalSum = results.reduce((acc, sum) => acc + sum, 0);
        const end = performance.now();
        console.log(`Total sum: ${totalSum}`);
        console.log(`Execution time: ${end - start} ms`);
    })
   .catch((err) => {
        console.error(err);
    });

在上述代码中:

  • 首先将大数组分割成 numWorkers 个部分。
  • 然后为每个数组部分创建一个工作线程,在工作线程内部对该部分数组元素进行平方求和计算。
  • 主线程通过 Promise.all 等待所有工作线程完成计算,并将结果汇总得到最终的总和。
  • 同时使用 performance.now() 来测量整个计算过程的执行时间。