Node JS:在执行时间方面,生成承诺数组然后使用 Promise.all 比循环并立即等待每个任务更好吗?
Node JS: execution-time-wise, is generating array of promises and then using Promise.all better than looping and instantly awaiting every task?
假设我们有一个必须上传到云服务的对象数组,该服务将对每个对象执行一些操作并 return 结果。该服务的客户端库具有上传对象和等待响应的单一功能。哪个代码 运行 更快:
async function extractDataInstantAwait(documents) {
const results = [];
for (const doc of documents) {
results.push(await client.extractData(doc));
}
return results;
}
async function extractDataPromiseAll(documents) {
const results = [];
for (const doc of documents) {
results.push(client.extractData(doc));
}
return Promise.all(results);
}
据我所知,Nodejs 没有运行 多线程异步代码,所以有人可能认为它们之间没有区别。但是,由于每次调用 client.extractData
都可能需要等待响应,Nodejs 的事件循环应该切换到下一个承诺,在那里做事(上传另一个文档),然后重复。也许,如果服务在解析每个对象时速度很慢,但我们知道它会为每个操作创建新线程,我们可以实现某种并发加速吗?
我的逻辑正确吗?
Promise.all 更快,因为 Promise.all 让所有的承诺 运行 并行,所以你的执行时间将是最长承诺的执行时间(或接近它) .
如果在循环中执行,promise 将一个接一个地执行,因此您的执行时间将是所有 promise 执行时间的总和。
如果你必须等待三个分别需要 200、300 和 500 毫秒的承诺 A、B 和 C。使用 Promise.all 它们将同时 运行 并且您将不得不等待 C 500 毫秒(A 和 B 将在此之前完成)。对于循环,您必须等待 A 200 毫秒,然后等待 B 300 毫秒,然后等待 C 500 毫秒,因此您总共需要等待 1000 毫秒。
假设我们有一个必须上传到云服务的对象数组,该服务将对每个对象执行一些操作并 return 结果。该服务的客户端库具有上传对象和等待响应的单一功能。哪个代码 运行 更快:
async function extractDataInstantAwait(documents) {
const results = [];
for (const doc of documents) {
results.push(await client.extractData(doc));
}
return results;
}
async function extractDataPromiseAll(documents) {
const results = [];
for (const doc of documents) {
results.push(client.extractData(doc));
}
return Promise.all(results);
}
据我所知,Nodejs 没有运行 多线程异步代码,所以有人可能认为它们之间没有区别。但是,由于每次调用 client.extractData
都可能需要等待响应,Nodejs 的事件循环应该切换到下一个承诺,在那里做事(上传另一个文档),然后重复。也许,如果服务在解析每个对象时速度很慢,但我们知道它会为每个操作创建新线程,我们可以实现某种并发加速吗?
我的逻辑正确吗?
Promise.all 更快,因为 Promise.all 让所有的承诺 运行 并行,所以你的执行时间将是最长承诺的执行时间(或接近它) .
如果在循环中执行,promise 将一个接一个地执行,因此您的执行时间将是所有 promise 执行时间的总和。
如果你必须等待三个分别需要 200、300 和 500 毫秒的承诺 A、B 和 C。使用 Promise.all 它们将同时 运行 并且您将不得不等待 C 500 毫秒(A 和 B 将在此之前完成)。对于循环,您必须等待 A 200 毫秒,然后等待 B 300 毫秒,然后等待 C 500 毫秒,因此您总共需要等待 1000 毫秒。