4

在我问我的问题之前,我想清楚地说明这一点,我知道基准永远不会说明整个故事。但我的目标相对简单,我希望看到从节点 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 总是表现最差。

4

0 回答 0