在我问我的问题之前,我想清楚地说明这一点,我知道基准永远不会说明整个故事。但我的目标相对简单,我希望看到从节点 10 到节点 12(及更高版本)关于异步函数和承诺的性能改进。我只需要一个粗略的想法来看看我能得到多少改进,毕竟这就是这里所说的https://v8.dev/blog/fast-async
所以我努力寻找一个简单的代码来做测试,然后我从https://fibjs.org/en/docs/guide/about.md.html找到这个,这比我能做的其他测试代码容易得多想出。
var count = 1000;
async function test_async(n) {
if (n == count)
return;
await test_async(n + 1);
}
function test_callback(n, cb) {
if (n == count)
return cb();
test_callback(n + 1, cb);
}
function test_sync(n) {
if (n == count)
return;
test_sync(n + 1);
}
async function test() {
console.time("async");
await test_async(0);
console.timeEnd("async");
console.time("callback");
test_callback(0, () => {
console.timeEnd("callback");
});
console.time("sync");
test_sync(0);
console.timeEnd("sync");
}
test(); //actually I also add a python timeit like code to repeat the test()
多次运行此代码,我确实发现节点 12 与节点 10 相比有很多改进。不幸的是,我没有看到从节点 12 到节点 14 的很多改进。
我的问题是这个测试代码在验证异步功能的改进方面是否有效?
---- 节点 16 的更新 ----
nodejs.16 于 2021.4.21 发布,但令我惊讶的是,当我使用带有 node 16 的脚本运行时,它的性能甚至比 nodejs 12 还要差!
随着 node16 V8 升级到 V8 9.0,我认为我应该得到一些性能改进。不知道为什么
----再次更新----
如果我只运行一次测试,节点 16 确实表现最好。但是如果我多次运行测试,比如 10 或 15 次,节点 16 会变得最差。
我最初使用一些自制的timeit库来运行测试,以减少任何意外因素,现在我只是像下面这样运行测试。
async function test() {
//async
console.time('async')
for (let index = 0; index < 15; index++) {
await test_async(0)
}
console.timeEnd('async')
//sync
console.time('sync')
for (let index = 0; index < 15; index++) {
test_sync(0)
}
console.timeEnd('sync')
}
节点 16 总是表现最差。