await
,我揭开了一个令人困惑的谜团。我在控制台中分别运行了以下代码片段数次,以过滤掉侥幸心理,并计算了相关数据的平均运行次数。
(function(console){
"use strict";
console.time();
var O = [1];
for (var i=0; i !== 107000; ++i) {
const O_0 = O[0];
O[0] = O_0;
}
console.timeEnd();
})(console);
导致:
default: 5.322021484375ms
async
(async function(console){
"use strict";
console.time();
var O = [1];
for (var i=0; i !== 107000; ++i) {
const O_0 = O[0];
O[0] = O_0;
}
console.timeEnd();
})(console);
很好!Chrome知道它的东西。非常低的开销:
default: 8.712890625ms
接下来,我尝试添加
(async function(console){
"use strict";
console.time();
var O = [1];
for (var i=0; i !== 107000; ++i) {
const O_0 = O[0];
O[0] = await O_0;
}
console.timeEnd();
})(console);
default: 724.706787109375ms
所以,一定有逻辑上的原因,对吧?我试着比较之前的类型。
(async function(console){
"use strict";
console.time();
var O = [1];
for (var i=0; i !== 107000; ++i) {
const O_0 = O[0];
O[0] = typeof O_0 === "object" ? await O_0 : O_0;
}
console.timeEnd();
})(console);
好吧,不是这样的:
default: 6.7939453125ms
因此,必须是承诺部分:检查传递给wait的项目是否是承诺。那一定是罪魁祸首,我是对的还是对的?
(async function(console, Promise){
"use strict";
const isPromise = Promise.prototype.isPrototypeOf.bind(Promise);
console.time();
var O = [1];
for (var i=0; i !== 107000; ++i) {
const O_0 = O[0];
O[0] = isPromise(O_0) ? await O_0 : O_0;
}
console.timeEnd();
})(console, Promise);
这将导致:
default: 7.2041015625ms
好吧,好吧,让我们先来猜疑一下。让我们假设一下,他们等待的远远不够完美。
(async function(console, Promise){
"use strict";
const isPromise = Promise.prototype.isPrototypeOf.bind(Promise.prototype);
console.time();
var O = [1];
for (var i=0; i !== 107000; ++i) {
const isAnObject = typeof O[0] === "object" ? true : false;
const isThisAPromise = isPromise(O[0]);
O[0] = isAnObject && isThisAPromise ? await O[0] : O[0];
}
console.timeEnd();
})(console, Promise);
但即使这样也无法解释
等待
:
default:7.85498046875ms
等待
至少比现在快100倍。我想不出一个好的理由来解释为什么在一个完美的世界里它不会快100倍。然而,我们并不是生活在一个完美的世界里,所以有一个问题:如何生活?怎样?怎么这么慢?有没有希望它在未来更快(比如说,大约快100倍)?我正在寻找事实和对这个问题的客观分析,以解释我在上述性能测试中看到的令人费解的谜团。