关于async/await和promise.all两种执行方式的速度快慢的问题
发布于 7 年前 作者 k-dylan 4550 次浏览 来自 问答

最近在做网站项目的时候,有这么一段代码:

 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毫秒,毫无疑问,第二种要更块一点,但是总觉得哪里还有问题,所以想请教一下各位,我这种测试的方式对么? 得出的结论是否靠谱?

6 回复

后一个是1000次串行,前一个是2000次,当然慢了

@rupertqin 对呀,第二个是并发执行的,那看来我的想法是正确的!!

第一种两个任务有顺序的异步执行,执行时间=第一个任务的时间+第二个任务时间,第二种并行异步,执行时间=两个任务取最长的执行时间

  let  [v1, v2] = await* [Promise.resolve(1), Promise.resolve(2)];

Async/Await语法

function f1(){} function f2(){} let f1Promise = f1(); let f2Promise = f2(); let foo = await f1Promise; let bar = await f2Promise; 这样就可以并行了

@sanrudongfeng 没有吧 我觉得这么写会先执行 f1Promise 等返回结果之后才会执行 f2Promise 并没有一起执行

@k-dylan 不会,因为是异步的一下子就两个函数都注册到事件队列里面取了,然后await就可以了。

回到顶部