在提出问题之前,我想澄清这一点,我知道基准永远不会说明全部情况。但我的目标相对简单,我希望看到从节点 10 到节点 12(及以上)关于异步函数和 Promise 的性能改进。我只需要一个粗略的想法,看看我能得到多少改进,毕竟这就是这里所说的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 始终表现最差。
我注意到node18发布了并且V8 JavaScript引擎升级到了10.1,所以我再次进行了测试,发现node18显着改善了测试结果,几乎减少了node 14 50%的运行时间。
实际上,虽然在我最初的测试中,node 16.0比nodejs 14.15慢,但我发现node 16.14.2的表现比node 14.19.0更好。
那么另一方面我确实觉得fibjs使用的测试很好。
---更新---
请查看2023 年 Node.js 性能状态,了解 16.20.0、18.16.0 和 20.0.0 之间的详细性能比较。但它缺乏异步函数/promise 的比较。