最近在做网站项目的时候,有这么一段代码:
topic.author = await User.findById(topic.author_id); //读取作者信息
topic.authorTopicList = await Topic.find({ // 读取作者其它主题
author_id: topic.author_id,
deleted: false
}, 'title', {
sort: '-create_time',
limit: 10
});
今天在看代码的时候,忽然想到这两个查询是可以同时查询的,于是就有了下面一种方式
[topic.author, topic.authorTopicList] = await Promise.all([
User.findById(topic.author_id), // 读取主题作者
Topic.find({ // 读取作者其它主题
author_id: topic.author_id,
deleted: false
}, 'title', {
sort: '-create_time',
limit: 10
})
]);
写完之后就纠结了,这两种方式无疑第一种看起来更清晰明了,但是两种方式那种快呢? 于是我就做了这样的测试
let start = Date.now();
for(let i = 0; i < 1000; i++) {
// 这里分别写上两种查询后执行
}
console.log(Date.now() - start);
最后得到的结果,第一种方式最快的时候是 1328毫秒,第二种方式最快的时候是945毫秒,毫无疑问,第二种要更块一点,但是总觉得哪里还有问题,所以想请教一下各位,我这种测试的方式对么? 得出的结论是否靠谱?
后一个是1000次串行,前一个是2000次,当然慢了
@rupertqin 对呀,第二个是并发执行的,那看来我的想法是正确的!!
第一种两个任务有顺序的异步执行,执行时间=第一个任务的时间+第二个任务时间,第二种并行异步,执行时间=两个任务取最长的执行时间
let [v1, v2] = await* [Promise.resolve(1), Promise.resolve(2)];
function f1(){} function f2(){} let f1Promise = f1(); let f2Promise = f2(); let foo = await f1Promise; let bar = await f2Promise; 这样就可以并行了
@sanrudongfeng 没有吧 我觉得这么写会先执行 f1Promise 等返回结果之后才会执行 f2Promise 并没有一起执行
@k-dylan 不会,因为是异步的一下子就两个函数都注册到事件队列里面取了,然后await就可以了。