paint-brush
多重处理如何帮助我将 JavaScript 应用程序速度提高 4 倍经过@rusanov
2,824 讀數
2,824 讀數

多重处理如何帮助我将 JavaScript 应用程序速度提高 4 倍

经过 Dmitrii Rusanov5m2023/07/25
Read on Terminal Reader

太長; 讀書

我们将通过引人入胜的代码示例深入研究 Node.js 中的多处理之谜。
featured image - 多重处理如何帮助我将 JavaScript 应用程序速度提高 4 倍
Dmitrii Rusanov HackerNoon profile picture
0-item
1-item

JavaScript 本质上被设计为单线程野兽。然而,在计算的狂野领域,被称为“多处理”和“多核处理器”的掠夺者正在等待被驯服,准备将代码执行速度提高到闻所未闻的速度。 💪🚀


我敢于踏入这片丛林,将我的代码进行最终的生存测试,并获得了惊人的结果。 🏆 现在,轮到你和我一起完成这个迷人的任务了。我们将深入研究Node.js 中的多重处理之谜,并提供引人入胜的代码示例,并将火炬🔦照亮我实验的惊人成果。 🍎🍏


准备好开启这场肾上腺素飙升的冒险之旅,通过多重处理的魔力来增强JavaScript性能!系好安全带,做好准备,我们即将进入令人着迷的高辛烷值编码领域。


在我们深入探索之前,让我们先配备一些可靠的工具。我们将创建一些辅助函数来模拟通常艰巨的计算工作。让我们创建一个新的工件,一个名为utils.js文件,并在其中写入这些基本咒语。


 // utils.js function generateRandomData(size) { const data = []; for (let i = 0; i < size; i++) { data.push(Math.random()); } return data; } function processData(data) { // performs some calculations on the array // to simulate high resource intensity let sum = 0; for (let num of data) { for (let j = 0; j < 1000000; j++) { sum += Math.sqrt(num); } } return sum; } module.exports = { generateRandomData, processData, };

单线程版本

在单线程中执行代表了一种勤奋且可靠的解决问题的方法。脚本的单线程版本可以这样直观地描述。 单线程单线程版本的代码非常简单。我们创建数据并将其发送出去进行处理。

 // sync.js const { generateRandomData, processData } = require("./utils"); const data = generateRandomData(30000); console.time("single-thread. Time:"); processData(data); console.timeEnd("single-thread. Time:");

我们使用以下命令启动脚本: node sync.js

我们等……等……等……

负载时间越长,咖啡就越浓!经过所有等待后,我们收到一条消息,指示脚本的执行时间。


 single-thread. Time:: 25.888s


这种方法适合大多数情况。但有一个问题。心智正常的人会喜欢等待的艺术吗?为了克服这种令人痛苦的延迟,我们应该充分利用计算机的火力!毕竟,大多数现代计算机都装载了多个 CPU 核心!


那么,当这些额外的核心可以处理数字并增强我们的代码执行时,我们为什么要让它们闲置呢?是时候点亮那些沉睡的巨人并释放多处理的原始力量了!让我们深入了解吧!

脚本的多处理版本

通过采用多处理方法,我们可以利用 CPU 的多个核心,将脚本的性能提高几倍。我们的多处理代码的操作过程可以通过此图可视化。

多处理版本本质上,我们只是将一个相当大的数据集划分为多个段,并将每个段分配给一个独立的 CPU 核心进行处理。


创建一个名为multi-process.js的文件并使用以下内容填充它。


 // multi-process.js const childProcess = require("child_process"); const utils = require("./utils"); const data = utils.generateRandomData(30000); const chunkSize = Math.ceil(data.length / 4); const chunks = []; for (let i = 0; i < 4; i++) { const start = i * chunkSize; const end = start + chunkSize; chunks.push(data.slice(start, end)); } console.time("multiProcessed"); const workers = []; let results = []; // result collection array for (let i = 0; i < chunks.length; i++) { const worker = childProcess.fork("./worker.js"); // pass its number and data to the workflow worker.send({ workerNumber: i, data: chunks[i] }); workers.push( new Promise((resolve, reject) => { worker.on("message", (result) => { results.push(result); // add the result to the result array resolve(); }); worker.on("error", reject); worker.on("exit", (code) => { if (code !== 0) { reject(new Error(`Worker stopped with exit code ${code}`)); } }); }) ); } Promise.all(workers) .then(() => { console.timeEnd("multiProcessed"); console.log("Processing results:", results); }) .catch((err) => console.error(err));


此代码揭示了 Node.js 中多处理数据处理的交响曲中单个工作进程的编排。


简而言之,这是发生的事情:

  • 工作线程通过process.on('message')从主进程接收数据及其编号。

  • processData函数对分配给该工作人员的数据部分进行计算。

  • 结果通过“process.send()”发送回主进程。

  • 工作进程通过process.exit()以代码 0 终止。


使用以下命令启动脚本: node multi-process.js

紧紧抓住涡轮增压...

快速加载我们得出的结论是该代码在 5 秒内运行!

 Worker 0 started Worker 1 started Worker 2 started Worker 3 started ==================== Worker 1 finished ==================== Worker 2 finished ==================== Worker 3 finished ==================== Worker 0 finished multiProcessed: 5.266s Processing results: [ 4971422688.053512, 4989646323.157899, 4999088030.661542, 5008034869.924775 ]


我们的脚本运行速度快了四倍!这不是很壮观吗?

伟大揭幕:测试结果

带着强烈的好奇心,我在一台配备 4 核处理器的计算机上运行了这两个脚本,等待见证奇迹的发生:


  • 独奏艺术家,我们的单线程脚本,在25.8 秒内辛勤地处理了数据。

  • 强大的团队,我们的多线程脚本,仅用了5.2 秒就完成了任务!


看看多处理的威力——计算速度超过四倍!

这些鲜明的对比凸显了多重处理如何极大地增强机器的计算能力并缩短执行时间。

最后的想法

我们激动人心的探索生动地描绘了多重处理如何增强Node.js 中的计算任务。将您的代码释放到每个处理器核心上可以提供切实的性能飞跃,类似于从步行到隐形传态的转变!


将此箭头添加到您的编码袋中并在您的项目中尝试这种方法绝对值得。随着 Node.js 中工作线程的出现,实现多处理变得轻而易举。


读到这里你有肾上腺素激增的感觉吗?欢迎在下面的评论中分享您自己在 Node.js 中使用多处理的经历!让我们一起继续揭开高速编码的奥秘。