Nodejs中promise.all里异步比for of循环做异步操作时间更快吗?
Nodejs中promise.all里异步比for of循环做异步操作时间更快吗?
按理说 promise.all 里异步是并行的 for of 循环做异步操作是串行的 在 promise.all 方法里运行时间应该更短,但是遇到了问题? 为什么在 promise.all()方法中做 mongoDB 的查询操作 要比在 for of 里的做同样的操作时间更久
async function test(){
let userItem=await User.find({},{uid:1,_id:0}).limit(10)
console.time('程序耗时 1')
for(var item of userItem){
await User.findOne({
uid:item.uid
})
}
console.timeEnd('程序耗时 1')
console.time('程序耗时 2')
await Promise.all(userItem.map(async item=>{
let user=await User.findOne({
uid:item.uid
})
return user
}))
console.timeEnd('程序耗时 2')
}
程序耗时 1: 32.129ms
程序耗时 2: 3025.852s
感觉 promise.all 方法查询完之后卡了好久才返回结果 猜测是数据库的连接问题吗?? 求大佬解答!
是“并发”而不是“并行”。
Promise.all 等价于下面这个写法(不考虑异常情况):
var awaitables = [];
for (var item of userItem)
awaitables.push(User.findOne({ uid: item.uid });
for (var awtb of awaitables)
await awtb;
你可以试试这样做的情况。
另外你的计时方法不好,应该掐头(抹去 JIT 编译)并重复。
你的 for of
中的 await 会等待上一个执行完才会执行下一个。
Promise.all 并不会保证顺序,也不等待上一个异步任务执行完,但是可以保证在所有异步全部执行完后才结束。
试试直接返回 promise 呗,
await Promise.all(userItem.map(item=>{return User.findOne({ uid:item.uid }) }))
楼主原先的写法类似于一群已经拉完屎的人挤在厕所等茅坑。
对我之后就是直接返回的 promise 但是时间感觉也是差不多 promise.all 还是会卡好久
不负责任猜测,可能是你的 mongodb 服务器性能太差,n 个请求顺序阻塞处理居然比并发同时处理 n 个请求还快,2333333
我是开的本地的 localhost 的 有什么影响吗 刚学 node 不久。。
怀疑你用了 babel 或者 nodejs 使用了出乎意料的优化导致
建议你修改一下程序 1,把循环 await 返回值保存到一个数组里面而不是直接丢弃
不应该是 User.find 比 User.findOne 快的问题吗?
和 Promise 没有关系.
我感觉是你的 Promise.all 用的不对
把 userItem.map(后面的函数的 async 和 await 去掉试试
是.
但我的意思是批量获取的时候就不要用 findOne 这种.
后面去掉了 其实结果也是差不多的速度没差多少
试了下你说的 promise.all 的那种写法 确实是快一些
在Node.js中,Promise.all
与 for...of
循环进行异步操作的性能对比,主要取决于具体的用例和异步操作的性质。不过,通常来说,Promise.all
在处理多个并行异步任务时,会比 for...of
循环(如果它顺序执行异步任务)更快。
示例代码对比
使用 Promise.all
const asyncTasks = [
asyncFunction1(),
asyncFunction2(),
asyncFunction3()
];
Promise.all(asyncTasks)
.then(results => {
console.log(results);
})
.catch(error => {
console.error(error);
});
在这个例子中,asyncFunction1
, asyncFunction2
, 和 asyncFunction3
会并行执行。
使用 for...of
循环(顺序执行)
let results = [];
for (const task of [asyncFunction1(), asyncFunction2(), asyncFunction3()]) {
results.push(await task);
}
console.log(results);
在这个例子中,异步任务会按顺序执行,每个任务在前一个任务完成后才开始。
性能分析
- 并行执行 (
Promise.all
):所有任务同时开始,总时间等于最长任务的时间。 - 顺序执行 (
for...of
withawait
):总时间等于所有任务时间之和。
因此,如果多个任务可以并行处理且没有相互依赖,Promise.all
通常会比 for...of
循环更快。然而,如果任务之间有依赖关系,必须使用 for...of
或其他方式依次处理。