如何从程序执行时间体现async的异步性
1.为了测试async的异步性能,写了如下代码(可直接在浏览器console或node上运行)
async function maptest(item) {
console.time('x'+item);
console.log(item);
for(let i = 0; i< 100000; i++) {
let name = "test";
}
console.timeEnd('x'+item);
return 1;
}
var list = [1,2,3,4,5,6,7,8,9,0];
console.time('xall');
for(var i = 0; i < 10; i++)
{
maptest(list[i]).then();
}
console.timeEnd('xall');
输出结果为:
1
x1: 1.18212890625ms
2
x2: 0.097900390625ms
3
x3: 0.0830078125ms
4
x4: 0.078857421875ms
5
x5: 0.078857421875ms
6
x6: 0.080078125ms
7
x7: 0.080078125ms
8
x8: 0.079833984375ms
9
x9: 0.0810546875ms
0
x0: 0.0791015625ms
xall: 3.309814453125ms
1.182+0.098+0.083+0.079+0.079+0.080+0.080+0.080+0.081+0.079=1.921 < 3.3
问:从执行时间来看,总执行耗时并不是最长的一次maptest执行耗时,反而是比所有maptest函数执行时间之和还长。async不是异步执行的吗,此处为何体现不出async的异步性能?另外,为什么x1的执行时间远远大于其他时间?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
JS线程始终只有一个。xall也不是执行的时间,只是返回的时间。
你试试在maptest开头加一行
await null
会怎样测试你得有个对比吧,和promise对比,async也不是为了性能吧,应该是让你可以像写同步代码一样写异步代码;至于x1的执行时间远远大于其他时间,你每次循环做的事情一样,我猜v8的强大缓存能力帮你优化了
首先,不能说 async 是异步执行的,例如:
async 函数能够出让执行权力,先执行其它代码,适当时候再回来继续执行 async 剩余代码:
所以,你的代码都是同步执行的。多说几句,JS 执行线程是单线程,在执行线程上执行是无法体现异步的优势的,你可以试试用 Worker 来测试 async 函数。
async 的异步,指的是函数调用后
then
的触发是异步。async 函数里边的代码还是同步的。