Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

with node16 I see performance of async/await is worse than node 12 #38339

Closed
qiulang opened this issue Apr 22, 2021 · 22 comments
Closed

with node16 I see performance of async/await is worse than node 12 #38339

qiulang opened this issue Apr 22, 2021 · 22 comments
Labels
performance Issues and PRs related to the performance of Node.js.

Comments

@qiulang
Copy link

qiulang commented Apr 22, 2021

  • Version: 16.0.0

  • Platform: Darwin Kernel Version 20.3.0: Thu Jan 21 00:07:06 PST 2021; root:xnu-7195.81.3~1/RELEASE_X86_64 x86_64

  • MacbookPro 2015 , 2.5 GHz Quad-Core Intel Core i7, 16 GB 1600 MHz DDR3

What steps will reproduce the bug?

Before I file this issue I know benchmarks never tell the whole story. But my goal here is relatively simple, I want to see the performance improvement regarding async functions and promises.

I use n to install following node version:

node/10.23.0
node/12.19.1
node/12.22.1
node/14.15.1
node/16.0.0

I run a simple performance test code using the idea from https://fibjs.org/ and write my own timeit to repeat the test.
I actually asked the question at SO https://stackoverflow.com/questions/64886560/simple-practical-example-to-see-faster-async-functions-and-promises-from-node-10 when node 14 came out.

The reason I file the issue here is I test my code against node 16. and found it 's performance is worse than 12 & 14.

@qiulang
Copy link
Author

qiulang commented Apr 22, 2021

The test code (from https://fibjs.org/en/docs/guide/about.md.html [Embrace high energy] section)

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()

@Ayase-252 Ayase-252 added the performance Issues and PRs related to the performance of Node.js. label Apr 22, 2021
@aduh95
Copy link
Contributor

aduh95 commented Apr 22, 2021

What are the results you are seeing? Here are the results on my machine (macOS 11.2, x86_64):

v14.16.0:
async: 1.492ms
callback: 0.073ms
sync: 0.048ms

v16.0.0:
async: 0.503ms
callback: 0.059ms
sync: 0.058ms

I assume "less is better", right?

@qiulang
Copy link
Author

qiulang commented Apr 22, 2021

Your result is different from mine, I run each test 10 times and several runs, following is one of my results. Node 16 is always the worst

node 12.22

async: 5.876ms
sync: 0.374ms

node 14.15

async: 5.71ms
sync: 0.353ms

node 16

async: 6.054ms
sync: 0.389ms

@Linkgoron
Copy link
Member

Linkgoron commented Apr 22, 2021

My numbers also show improvement (macOS 10.15.7, x86_64):

Node 12.22:

async: 1.863ms
callback: 0.070ms
sync: 0.099ms

Node 14.16:

async: 1.253ms
callback: 0.064ms
sync: 0.063ms

Node 16:

async: 0.443ms
callback: 0.054ms
sync: 0.061ms

@qiulang
Copy link
Author

qiulang commented Apr 22, 2021

@Linkgoron @aduh95 I found you guys just run test once, try to run them several times, as simple as

    console.time('async')
    for (let index = 0; index < 10; index++) {
        await test_async(0)
    }
    console.timeEnd('async')

@Ayase-252
Copy link
Member

@qiulang

In my machine, it varies greatly in different runs. Could you provide some statistics like average and variance of run time in your tests? It would help us to identify whether there is performance regression.

@qiulang
Copy link
Author

qiulang commented Apr 22, 2021

@Ayase-252 will do. But let me find more machines to repeat my test first.

@qiulang
Copy link
Author

qiulang commented Apr 22, 2021

@Linkgoron @Ayase-252 @aduh95 if you just run my test once, node 16 indeed performs best. I have the similar result like yours. But if you run test more than once, say 10 or 15 time, node 16 becomes worst.

I initially use some home-made timeit library to run the test, to reduce any unexpected factor, now I just run test like following. Please check if you have the similar result.

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')
} 

@aduh95
Copy link
Contributor

aduh95 commented Apr 22, 2021

I've made a benchmark script that uses Node.js benchmarking tool:

'use strict';
const common = require('../common.js');
const bench = common.createBenchmark(main, {
  count: [1, 10, 100, 1_000, 5_000],
  test: ['async', 'callback', 'sync'],
});

async function test_async(n) {
  if (n === 0) return;
  await test_async(n - 1);
}

function test_callback(n, cb) {
  if (n === 0) return cb();

  test_callback(n - 1, cb);
}

function test_sync(n) {
  if (n === 0) return;
  test_sync(n - 1);
}

function main({ count, test }) {
  bench.start();
  switch (test) {
    case 'async':
      test_async(count).then(() => bench.end(count));
      break;

    case 'callback':
      test_callback(count, () => bench.end(count));
      break;

    case 'sync':
      test_sync(count);
      bench.end(count);
      break;
  }
}

I put it in benchmark/async/async.js and ran the following command:

$ /usr/local/bin/node --version
v16.0.0
$ /usr/local/Cellar/node@14/14.16.0_1/bin/node --version
v14.16.0
$ node benchmark/compare.js --new /usr/local/bin/node --old /usr/local/Cellar/node@14/14.16.0_1/bin/node -- async | Rscript benchmark/compare.R
[00:00:56|% 100| 1/1 files | 60/60 runs | 15/15 configs]: Done
                                           confidence improvement accuracy (*)   (**)   (***)
async/async.js test='async' count=1              ***      9.85 %       ±5.55% ±7.38%  ±9.60%
async/async.js test='async' count=10               *      6.40 %       ±5.22% ±6.96%  ±9.06%
async/async.js test='async' count=100                     6.20 %       ±6.47% ±8.61% ±11.22%
async/async.js test='async' count=1000           ***    -10.17 %       ±5.22% ±6.95%  ±9.05%
async/async.js test='async' count=5000            **      6.30 %       ±4.56% ±6.07%  ±7.89%
async/async.js test='callback' count=1           ***     15.90 %       ±4.87% ±6.49%  ±8.45%
async/async.js test='callback' count=10          ***     17.07 %       ±4.87% ±6.48%  ±8.43%
async/async.js test='callback' count=100         ***     13.82 %       ±5.64% ±7.52%  ±9.82%
async/async.js test='callback' count=1000        ***     10.43 %       ±5.63% ±7.49%  ±9.76%
async/async.js test='callback' count=5000                -4.47 %       ±5.50% ±7.32%  ±9.53%
async/async.js test='sync' count=1               ***     18.13 %       ±5.25% ±6.99%  ±9.11%
async/async.js test='sync' count=10              ***     16.84 %       ±5.43% ±7.23%  ±9.43%
async/async.js test='sync' count=100             ***     10.78 %       ±4.64% ±6.18%  ±8.04%
async/async.js test='sync' count=1000                     0.70 %       ±5.46% ±7.28%  ±9.50%
async/async.js test='sync' count=5000             **     -8.14 %       ±5.69% ±7.57%  ±9.86%

Be aware that when doing many comparisons the risk of a false-positive
result increases. In this case, there are 15 comparisons, you can thus
expect the following amount of false-positive results:
  0.75 false positives, when considering a   5% risk acceptance (*, **, ***),
  0.15 false positives, when considering a   1% risk acceptance (**, ***),
  0.01 false positives, when considering a 0.1% risk acceptance (***)

As we can see, Node.js v16.0.0 has worse performance on async calls when count is 1000, but not for 5000 🤔
My guess is that V8 kicks off some heavy optimisation once the number of async calls reaches 1000 but it never pays off because we stop calling the function afterwards.

@qiulang
Copy link
Author

qiulang commented Apr 23, 2021

@aduh95 I tried to repeat your test with count = 500 and I found the node 16 was not much different from node 14 or 12.

I start to wonder is my test valid or meaningful at all ? Back to the time when I upgraded from node 10 to node 12 I saw obvious improvement under any test. So during that time I had thought my test was valid.

@aduh95
Copy link
Contributor

aduh95 commented Apr 23, 2021

So I've ran more benchmarks to understand what's the trend, here are the results for the async version only:

Count range Which is faster
0 - 320 v16.0.0
320 - 5000 v14.16.0
5000 - 8250 v16.0.0

The extreme value is -73.53 % for the value 1730 on my machine. If we graph the performance for each count value, we can see that V8 optimisation doesn't work as well for some values:

Chart showing v16.0.0 perf regressions for a range of values

@nodejs/v8 The performance decrease seems significant, it's probably worth taking a look.

Complete data
async/async.js test='async' count=10                   6.18 %       ±7.53% ±10.02% ±13.05%
async/async.js test='async' count=100                  6.53 %       ±6.84%  ±9.10% ±11.85%
async/async.js test='async' count=1000         **     -8.52 %       ±6.40%  ±8.52% ±11.09%
async/async.js test='async' count=1010          *     -7.51 %       ±6.88%  ±9.16% ±11.93%
async/async.js test='async' count=1020                -3.05 %       ±6.53%  ±8.70% ±11.33%
async/async.js test='async' count=1030          *     -7.09 %       ±7.01%  ±9.34% ±12.18%
async/async.js test='async' count=1040         **    -10.88 %       ±6.36%  ±8.46% ±11.02%
async/async.js test='async' count=1050                -7.02 %       ±7.15%  ±9.52% ±12.42%
async/async.js test='async' count=1060                -6.72 %       ±7.19%  ±9.58% ±12.49%
async/async.js test='async' count=1070         **     -9.24 %       ±6.75%  ±8.98% ±11.69%
async/async.js test='async' count=1080          *     -8.65 %       ±6.76%  ±8.99% ±11.70%
async/async.js test='async' count=1090         **    -10.13 %       ±6.33%  ±8.43% ±10.98%
async/async.js test='async' count=110                  2.62 %       ±7.10%  ±9.45% ±12.30%
async/async.js test='async' count=1100                -4.87 %       ±8.19% ±10.92% ±14.24%
async/async.js test='async' count=1110          *     -7.88 %       ±6.93%  ±9.22% ±12.01%
async/async.js test='async' count=1120          *     -9.48 %       ±8.12% ±10.81% ±14.07%
async/async.js test='async' count=1130         **     -9.21 %       ±6.40%  ±8.52% ±11.09%
async/async.js test='async' count=1140          *     -8.23 %       ±7.06%  ±9.40% ±12.25%
async/async.js test='async' count=1150          *     -7.11 %       ±6.70%  ±8.91% ±11.61%
async/async.js test='async' count=1160          *     -7.88 %       ±6.83%  ±9.09% ±11.86%
async/async.js test='async' count=1170        ***    -11.81 %       ±6.07%  ±8.08% ±10.51%
async/async.js test='async' count=1180         **     -9.49 %       ±6.97%  ±9.28% ±12.08%
async/async.js test='async' count=1190         **    -10.73 %       ±6.26%  ±8.33% ±10.87%
async/async.js test='async' count=120                  3.95 %       ±7.48%  ±9.96% ±12.97%
async/async.js test='async' count=1200         **    -10.42 %       ±7.71% ±10.27% ±13.38%
async/async.js test='async' count=1210        ***    -67.97 %       ±6.17%  ±8.29% ±10.96%
async/async.js test='async' count=1220        ***    -68.62 %       ±6.41%  ±8.61% ±11.37%
async/async.js test='async' count=1230        ***    -68.60 %       ±5.05%  ±6.78%  ±8.93%
async/async.js test='async' count=1240        ***    -67.64 %       ±5.75%  ±7.73% ±10.21%
async/async.js test='async' count=1250        ***    -67.78 %       ±6.26%  ±8.41% ±11.12%
async/async.js test='async' count=1260        ***    -67.45 %       ±6.22%  ±8.36% ±11.03%
async/async.js test='async' count=1270        ***    -69.08 %       ±4.65%  ±6.24%  ±8.23%
async/async.js test='async' count=1280        ***    -68.90 %       ±5.52%  ±7.41%  ±9.76%
async/async.js test='async' count=1290        ***    -70.19 %       ±4.59%  ±6.16%  ±8.12%
async/async.js test='async' count=130                  0.28 %       ±6.27%  ±8.34% ±10.85%
async/async.js test='async' count=1300        ***    -68.41 %       ±5.09%  ±6.82%  ±8.99%
async/async.js test='async' count=1310        ***    -68.93 %       ±5.16%  ±6.92%  ±9.12%
async/async.js test='async' count=1320        ***    -68.19 %       ±5.37%  ±7.21%  ±9.52%
async/async.js test='async' count=1330        ***    -68.26 %       ±5.56%  ±7.46%  ±9.84%
async/async.js test='async' count=1340        ***    -66.99 %       ±5.39%  ±7.24%  ±9.57%
async/async.js test='async' count=1350        ***    -67.78 %       ±4.87%  ±6.53%  ±8.60%
async/async.js test='async' count=1360        ***    -67.06 %       ±5.86%  ±7.87% ±10.40%
async/async.js test='async' count=1370        ***    -67.44 %       ±5.24%  ±7.04%  ±9.28%
async/async.js test='async' count=1380        ***    -67.80 %       ±3.98%  ±5.33%  ±7.01%
async/async.js test='async' count=1390        ***    -68.04 %       ±5.63%  ±7.56%  ±9.96%
async/async.js test='async' count=140                  2.57 %       ±6.50%  ±8.65% ±11.26%
async/async.js test='async' count=1400        ***    -68.28 %       ±5.38%  ±7.20%  ±9.47%
async/async.js test='async' count=1410        ***    -67.08 %       ±5.10%  ±6.83%  ±9.00%
async/async.js test='async' count=1420        ***    -67.35 %       ±5.87%  ±7.89% ±10.41%
async/async.js test='async' count=1430        ***    -67.04 %       ±5.25%  ±7.05%  ±9.29%
async/async.js test='async' count=1440        ***    -67.40 %       ±5.33%  ±7.16%  ±9.44%
async/async.js test='async' count=1450        ***    -68.12 %       ±5.42%  ±7.27%  ±9.59%
async/async.js test='async' count=1460        ***    -67.24 %       ±5.55%  ±7.44%  ±9.80%
async/async.js test='async' count=1470        ***    -66.72 %       ±5.03%  ±6.75%  ±8.89%
async/async.js test='async' count=1480        ***    -66.87 %       ±5.37%  ±7.19%  ±9.44%
async/async.js test='async' count=1490        ***    -66.40 %       ±6.01%  ±8.06% ±10.64%
async/async.js test='async' count=150                  2.85 %       ±7.71% ±10.26% ±13.36%
async/async.js test='async' count=1500        ***    -65.71 %       ±4.78%  ±6.41%  ±8.44%
async/async.js test='async' count=1510        ***    -66.74 %       ±5.15%  ±6.90%  ±9.08%
async/async.js test='async' count=1520        ***    -66.16 %       ±4.66%  ±6.26%  ±8.25%
async/async.js test='async' count=1530        ***    -66.16 %       ±5.23%  ±7.02%  ±9.26%
async/async.js test='async' count=1540        ***    -65.08 %       ±6.85%  ±9.20% ±12.15%
async/async.js test='async' count=1550        ***    -66.37 %       ±5.43%  ±7.28%  ±9.60%
async/async.js test='async' count=1560        ***    -65.43 %       ±5.15%  ±6.90%  ±9.10%
async/async.js test='async' count=1570        ***    -65.71 %       ±5.27%  ±7.06%  ±9.30%
async/async.js test='async' count=1580        ***    -64.60 %       ±6.11%  ±8.19% ±10.81%
async/async.js test='async' count=1590        ***    -66.51 %       ±4.34%  ±5.82%  ±7.65%
async/async.js test='async' count=160                  2.29 %       ±6.84%  ±9.10% ±11.85%
async/async.js test='async' count=1600        ***    -65.39 %       ±5.67%  ±7.60% ±10.01%
async/async.js test='async' count=1610        ***    -64.85 %       ±5.15%  ±6.92%  ±9.13%
async/async.js test='async' count=1620        ***    -67.26 %       ±5.30%  ±7.10%  ±9.34%
async/async.js test='async' count=1630        ***    -66.79 %       ±5.21%  ±6.98%  ±9.18%
async/async.js test='async' count=1640        ***    -65.92 %       ±5.38%  ±7.22%  ±9.52%
async/async.js test='async' count=1650        ***    -66.10 %       ±4.51%  ±6.03%  ±7.93%
async/async.js test='async' count=1660        ***    -65.87 %       ±5.03%  ±6.75%  ±8.90%
async/async.js test='async' count=1670        ***    -66.38 %       ±5.44%  ±7.27%  ±9.53%
async/async.js test='async' count=1680        ***    -67.38 %       ±5.92%  ±7.90% ±10.32%
async/async.js test='async' count=1690        ***    -70.81 %       ±5.59%  ±7.47%  ±9.79%
async/async.js test='async' count=170                  5.58 %       ±7.57% ±10.08% ±13.12%
async/async.js test='async' count=1700        ***    -74.77 %       ±6.17%  ±8.28% ±10.93%
async/async.js test='async' count=1710        ***    -75.81 %       ±5.40%  ±7.26%  ±9.60%
async/async.js test='async' count=1720        ***    -74.17 %      ±10.07% ±13.56% ±17.99%
async/async.js test='async' count=1730        ***    -73.53 %      ±10.82% ±14.57% ±19.33%
async/async.js test='async' count=1740        ***    -66.90 %      ±17.25% ±23.24% ±30.83%
async/async.js test='async' count=1750        ***    -67.16 %      ±17.92% ±24.14% ±32.03%
async/async.js test='async' count=1760        ***    -54.06 %      ±17.55% ±23.63% ±31.34%
async/async.js test='async' count=1770        ***    -51.50 %      ±17.73% ±23.88% ±31.66%
async/async.js test='async' count=1780        ***    -49.18 %      ±16.77% ±22.59% ±29.96%
async/async.js test='async' count=1790        ***    -41.45 %      ±11.30% ±15.19% ±20.09%
async/async.js test='async' count=180                  5.76 %       ±7.94% ±10.57% ±13.76%
async/async.js test='async' count=1800        ***    -42.30 %       ±9.65% ±12.96% ±17.11%
async/async.js test='async' count=1810        ***    -38.78 %       ±6.39%  ±8.53% ±11.18%
async/async.js test='async' count=1820        ***    -36.16 %       ±5.61%  ±7.47%  ±9.76%
async/async.js test='async' count=1830        ***    -39.00 %       ±5.62%  ±7.51%  ±9.83%
async/async.js test='async' count=1840        ***    -38.08 %       ±5.62%  ±7.49%  ±9.79%
async/async.js test='async' count=1850        ***    -36.47 %       ±6.14%  ±8.20% ±10.73%
async/async.js test='async' count=1860        ***    -37.60 %       ±6.47%  ±8.63% ±11.28%
async/async.js test='async' count=1870        ***    -37.49 %       ±5.47%  ±7.30%  ±9.55%
async/async.js test='async' count=1880        ***    -37.62 %       ±7.08%  ±9.47% ±12.41%
async/async.js test='async' count=1890        ***    -36.32 %       ±5.82%  ±7.79% ±10.22%
async/async.js test='async' count=190                  1.57 %       ±6.80%  ±9.05% ±11.78%
async/async.js test='async' count=1900        ***    -38.87 %       ±5.80%  ±7.72% ±10.06%
async/async.js test='async' count=1910        ***    -36.86 %       ±6.45%  ±8.60% ±11.23%
async/async.js test='async' count=1920        ***    -38.64 %       ±5.81%  ±7.74% ±10.10%
async/async.js test='async' count=1930        ***    -38.65 %       ±5.70%  ±7.61%  ±9.96%
async/async.js test='async' count=1940        ***    -38.83 %       ±5.86%  ±7.82% ±10.22%
async/async.js test='async' count=1950        ***    -36.02 %       ±5.28%  ±7.05%  ±9.20%
async/async.js test='async' count=1960        ***    -35.81 %       ±6.27%  ±8.38% ±10.98%
async/async.js test='async' count=1970        ***    -36.54 %       ±5.63%  ±7.50%  ±9.78%
async/async.js test='async' count=1980        ***    -38.93 %       ±5.73%  ±7.63%  ±9.94%
async/async.js test='async' count=1990        ***    -35.78 %       ±7.20%  ±9.62% ±12.61%
async/async.js test='async' count=20                   6.12 %       ±7.17%  ±9.55% ±12.43%
async/async.js test='async' count=200                  0.85 %       ±6.79%  ±9.03% ±11.76%
async/async.js test='async' count=2000        ***    -37.40 %       ±5.84%  ±7.78% ±10.14%
async/async.js test='async' count=2010        ***    -39.39 %       ±5.51%  ±7.34%  ±9.57%
async/async.js test='async' count=2020        ***    -35.37 %       ±5.57%  ±7.44%  ±9.74%
async/async.js test='async' count=2030        ***    -37.73 %       ±5.64%  ±7.52%  ±9.82%
async/async.js test='async' count=2040        ***    -36.64 %       ±5.39%  ±7.18%  ±9.37%
async/async.js test='async' count=2050        ***    -39.58 %       ±5.03%  ±6.71%  ±8.76%
async/async.js test='async' count=2060        ***    -39.34 %       ±5.17%  ±6.88%  ±8.95%
async/async.js test='async' count=2070        ***    -37.29 %       ±5.47%  ±7.29%  ±9.51%
async/async.js test='async' count=2080        ***    -34.12 %       ±5.29%  ±7.06%  ±9.23%
async/async.js test='async' count=2090        ***    -36.41 %       ±5.85%  ±7.82% ±10.24%
async/async.js test='async' count=210                  5.35 %       ±6.70%  ±8.91% ±11.60%
async/async.js test='async' count=2100        ***    -38.17 %       ±6.34%  ±8.45% ±11.03%
async/async.js test='async' count=2110        ***    -36.60 %       ±5.91%  ±7.90% ±10.35%
async/async.js test='async' count=2120        ***    -35.64 %       ±5.80%  ±7.75% ±10.13%
async/async.js test='async' count=2130        ***    -34.97 %       ±6.29%  ±8.38% ±10.95%
async/async.js test='async' count=2140        ***    -39.41 %       ±5.62%  ±7.49%  ±9.75%
async/async.js test='async' count=2150        ***    -35.95 %       ±5.90%  ±7.87% ±10.28%
async/async.js test='async' count=2160        ***    -34.92 %       ±6.03%  ±8.06% ±10.56%
async/async.js test='async' count=2170        ***    -35.77 %       ±6.53%  ±8.72% ±11.41%
async/async.js test='async' count=2180        ***    -35.75 %       ±6.45%  ±8.61% ±11.28%
async/async.js test='async' count=2190        ***    -33.22 %       ±6.67%  ±8.92% ±11.70%
async/async.js test='async' count=220                  1.35 %       ±7.07%  ±9.40% ±12.24%
async/async.js test='async' count=2200        ***    -33.94 %       ±6.72%  ±8.97% ±11.75%
async/async.js test='async' count=2210        ***    -35.23 %       ±6.67%  ±8.93% ±11.74%
async/async.js test='async' count=2220        ***    -35.48 %       ±5.84%  ±7.80% ±10.20%
async/async.js test='async' count=2230        ***    -36.40 %       ±5.66%  ±7.56%  ±9.90%
async/async.js test='async' count=2240        ***    -34.23 %       ±5.72%  ±7.64% ±10.00%
async/async.js test='async' count=2250        ***    -35.91 %       ±6.15%  ±8.19% ±10.69%
async/async.js test='async' count=2260        ***    -34.66 %       ±6.87%  ±9.18% ±12.02%
async/async.js test='async' count=2270        ***    -33.93 %       ±6.26%  ±8.36% ±10.93%
async/async.js test='async' count=2280        ***    -35.44 %       ±6.17%  ±8.24% ±10.77%
async/async.js test='async' count=2290        ***    -36.60 %       ±6.14%  ±8.18% ±10.68%
async/async.js test='async' count=230                  2.78 %       ±8.19% ±10.91% ±14.20%
async/async.js test='async' count=2300        ***    -37.06 %       ±6.70%  ±8.93% ±11.64%
async/async.js test='async' count=2310        ***    -36.79 %       ±5.46%  ±7.27%  ±9.48%
async/async.js test='async' count=2320        ***    -36.15 %       ±6.33%  ±8.44% ±11.02%
async/async.js test='async' count=2330        ***    -33.72 %       ±6.05%  ±8.09% ±10.60%
async/async.js test='async' count=2340        ***    -34.98 %       ±6.27%  ±8.36% ±10.92%
async/async.js test='async' count=2350        ***    -38.36 %       ±5.37%  ±7.15%  ±9.33%
async/async.js test='async' count=2360        ***    -35.26 %       ±6.52%  ±8.71% ±11.41%
async/async.js test='async' count=2370        ***    -36.70 %       ±6.27%  ±8.36% ±10.92%
async/async.js test='async' count=2380        ***    -35.73 %       ±6.29%  ±8.39% ±10.97%
async/async.js test='async' count=2390        ***    -36.82 %       ±6.88%  ±9.18% ±11.99%
async/async.js test='async' count=240                  2.42 %       ±7.34%  ±9.77% ±12.72%
async/async.js test='async' count=2400        ***    -35.16 %       ±6.67%  ±8.90% ±11.62%
async/async.js test='async' count=2410        ***    -36.40 %       ±5.00%  ±6.66%  ±8.69%
async/async.js test='async' count=2420        ***    -35.26 %       ±5.79%  ±7.71% ±10.06%
async/async.js test='async' count=2430        ***    -35.26 %       ±6.13%  ±8.16% ±10.65%
async/async.js test='async' count=2440        ***    -37.17 %       ±5.61%  ±7.48%  ±9.76%
async/async.js test='async' count=2450        ***    -37.14 %       ±5.96%  ±7.95% ±10.40%
async/async.js test='async' count=2460        ***    -34.45 %       ±6.04%  ±8.04% ±10.50%
async/async.js test='async' count=2470        ***    -34.40 %       ±6.08%  ±8.11% ±10.59%
async/async.js test='async' count=2480        ***    -34.44 %       ±6.00%  ±8.00% ±10.46%
async/async.js test='async' count=2490        ***    -32.47 %       ±6.23%  ±8.30% ±10.83%
async/async.js test='async' count=250                  2.56 %       ±7.17%  ±9.54% ±12.42%
async/async.js test='async' count=2500        ***    -34.34 %       ±5.87%  ±7.82% ±10.20%
async/async.js test='async' count=2510        ***    -32.71 %       ±6.63%  ±8.86% ±11.61%
async/async.js test='async' count=2520        ***    -32.78 %       ±7.13%  ±9.51% ±12.42%
async/async.js test='async' count=2530        ***    -35.25 %       ±6.04%  ±8.04% ±10.49%
async/async.js test='async' count=2540        ***    -35.85 %       ±6.15%  ±8.19% ±10.68%
async/async.js test='async' count=2550        ***    -32.71 %       ±8.09% ±10.81% ±14.15%
async/async.js test='async' count=2560        ***    -33.38 %       ±6.58%  ±8.77% ±11.43%
async/async.js test='async' count=2570        ***    -32.50 %       ±6.59%  ±8.81% ±11.53%
async/async.js test='async' count=2580        ***    -32.65 %       ±6.38%  ±8.50% ±11.08%
async/async.js test='async' count=2590        ***    -34.24 %       ±6.33%  ±8.43% ±10.99%
async/async.js test='async' count=260           *      9.32 %       ±8.18% ±10.92% ±14.26%
async/async.js test='async' count=2600        ***    -34.91 %       ±6.48%  ±8.64% ±11.26%
async/async.js test='async' count=2610        ***    -35.79 %       ±6.19%  ±8.25% ±10.76%
async/async.js test='async' count=2620        ***    -31.65 %       ±5.90%  ±7.87% ±10.26%
async/async.js test='async' count=2630        ***    -32.77 %       ±6.56%  ±8.73% ±11.38%
async/async.js test='async' count=2640        ***    -32.05 %       ±6.40%  ±8.53% ±11.13%
async/async.js test='async' count=2650        ***    -35.04 %       ±6.21%  ±8.27% ±10.79%
async/async.js test='async' count=2660        ***    -28.27 %       ±7.42%  ±9.90% ±12.96%
async/async.js test='async' count=2670        ***    -32.77 %       ±5.02%  ±6.69%  ±8.72%
async/async.js test='async' count=2680        ***    -33.48 %       ±6.17%  ±8.22% ±10.72%
async/async.js test='async' count=2690        ***    -33.25 %       ±5.37%  ±7.16%  ±9.33%
async/async.js test='async' count=270                  1.61 %       ±6.60%  ±8.79% ±11.44%
async/async.js test='async' count=2700        ***    -32.84 %       ±6.26%  ±8.35% ±10.92%
async/async.js test='async' count=2710        ***    -31.31 %       ±6.48%  ±8.65% ±11.30%
async/async.js test='async' count=2720        ***    -31.91 %       ±6.03%  ±8.04% ±10.48%
async/async.js test='async' count=2730        ***    -33.02 %       ±6.79%  ±9.04% ±11.79%
async/async.js test='async' count=2740        ***    -31.22 %       ±6.46%  ±8.62% ±11.27%
async/async.js test='async' count=2750        ***    -34.46 %       ±5.66%  ±7.54%  ±9.82%
async/async.js test='async' count=2760        ***    -32.01 %       ±6.28%  ±8.37% ±10.91%
async/async.js test='async' count=2770        ***    -33.34 %       ±6.39%  ±8.50% ±11.06%
async/async.js test='async' count=2780        ***    -32.70 %       ±6.66%  ±8.88% ±11.58%
async/async.js test='async' count=2790        ***    -32.83 %       ±7.15%  ±9.51% ±12.38%
async/async.js test='async' count=280                  0.97 %       ±8.73% ±11.62% ±15.13%
async/async.js test='async' count=2800        ***    -29.88 %       ±7.12%  ±9.50% ±12.41%
async/async.js test='async' count=2810        ***    -30.38 %       ±5.75%  ±7.65%  ±9.97%
async/async.js test='async' count=2820        ***    -30.96 %       ±5.86%  ±7.82% ±10.20%
async/async.js test='async' count=2830        ***    -29.38 %       ±5.95%  ±7.91% ±10.30%
async/async.js test='async' count=2840        ***    -30.36 %       ±6.39%  ±8.50% ±11.08%
async/async.js test='async' count=2850        ***    -30.34 %       ±6.27%  ±8.35% ±10.88%
async/async.js test='async' count=2860        ***    -28.28 %       ±6.80%  ±9.07% ±11.84%
async/async.js test='async' count=2870        ***    -29.22 %       ±6.52%  ±8.69% ±11.34%
async/async.js test='async' count=2880        ***    -28.38 %       ±6.80%  ±9.05% ±11.81%
async/async.js test='async' count=2890        ***    -30.56 %       ±6.38%  ±8.49% ±11.06%
async/async.js test='async' count=290                  2.38 %       ±7.51% ±10.00% ±13.02%
async/async.js test='async' count=2900        ***    -32.35 %       ±6.12%  ±8.14% ±10.62%
async/async.js test='async' count=2910        ***    -30.36 %       ±6.06%  ±8.08% ±10.55%
async/async.js test='async' count=2920        ***    -29.84 %       ±6.52%  ±8.71% ±11.40%
async/async.js test='async' count=2930        ***    -28.72 %       ±6.68%  ±8.90% ±11.61%
async/async.js test='async' count=2940        ***    -27.98 %       ±5.74%  ±7.63%  ±9.94%
async/async.js test='async' count=2950        ***    -31.34 %       ±6.48%  ±8.64% ±11.27%
async/async.js test='async' count=2960        ***    -29.30 %       ±6.23%  ±8.29% ±10.80%
async/async.js test='async' count=2970        ***    -29.62 %       ±5.30%  ±7.06%  ±9.19%
async/async.js test='async' count=2980        ***    -30.21 %       ±5.86%  ±7.81% ±10.20%
async/async.js test='async' count=2990        ***    -28.35 %       ±5.54%  ±7.37%  ±9.59%
async/async.js test='async' count=30            *      7.03 %       ±5.96%  ±7.94% ±10.33%
async/async.js test='async' count=300                  0.63 %       ±6.97%  ±9.27% ±12.07%
async/async.js test='async' count=3000        ***    -27.34 %       ±6.25%  ±8.32% ±10.84%
async/async.js test='async' count=3010        ***    -29.06 %       ±5.92%  ±7.88% ±10.26%
async/async.js test='async' count=3020        ***    -29.15 %       ±5.92%  ±7.88% ±10.26%
async/async.js test='async' count=3030        ***    -32.71 %       ±5.44%  ±7.26%  ±9.48%
async/async.js test='async' count=3040        ***    -29.04 %       ±6.70%  ±8.93% ±11.64%
async/async.js test='async' count=3050        ***    -27.14 %       ±6.66%  ±8.87% ±11.57%
async/async.js test='async' count=3060        ***    -28.80 %       ±6.24%  ±8.31% ±10.84%
async/async.js test='async' count=3070        ***    -27.88 %       ±5.72%  ±7.61%  ±9.91%
async/async.js test='async' count=3080        ***    -29.38 %       ±6.85%  ±9.14% ±11.95%
async/async.js test='async' count=3090        ***    -29.89 %       ±5.96%  ±7.93% ±10.33%
async/async.js test='async' count=310                 -0.74 %       ±7.09%  ±9.44% ±12.29%
async/async.js test='async' count=3100        ***    -28.80 %       ±6.73%  ±8.96% ±11.67%
async/async.js test='async' count=3110        ***    -28.55 %       ±6.18%  ±8.22% ±10.70%
async/async.js test='async' count=3120        ***    -30.57 %       ±6.36%  ±8.46% ±11.02%
async/async.js test='async' count=3130        ***    -28.30 %       ±7.01%  ±9.33% ±12.15%
async/async.js test='async' count=3140        ***    -27.94 %       ±7.22%  ±9.65% ±12.63%
async/async.js test='async' count=3150        ***    -24.10 %       ±6.40%  ±8.54% ±11.16%
async/async.js test='async' count=3160        ***    -26.46 %       ±7.17%  ±9.56% ±12.48%
async/async.js test='async' count=3170        ***    -24.59 %       ±6.38%  ±8.51% ±11.11%
async/async.js test='async' count=3180        ***    -27.87 %       ±6.84%  ±9.14% ±11.95%
async/async.js test='async' count=3190        ***    -28.16 %       ±6.88%  ±9.17% ±11.96%
async/async.js test='async' count=320                  0.21 %       ±6.87%  ±9.14% ±11.91%
async/async.js test='async' count=3200        ***    -28.04 %       ±6.90%  ±9.20% ±12.02%
async/async.js test='async' count=3210        ***    -28.25 %       ±6.01%  ±8.03% ±10.49%
async/async.js test='async' count=3220        ***    -27.54 %       ±5.50%  ±7.32%  ±9.53%
async/async.js test='async' count=3230        ***    -28.83 %       ±7.54% ±10.06% ±13.15%
async/async.js test='async' count=3240        ***    -25.97 %       ±6.11%  ±8.16% ±10.67%
async/async.js test='async' count=3250        ***    -27.11 %       ±5.90%  ±7.86% ±10.25%
async/async.js test='async' count=3260        ***    -27.94 %       ±6.22%  ±8.28% ±10.79%
async/async.js test='async' count=3270        ***    -26.35 %       ±6.52%  ±8.69% ±11.33%
async/async.js test='async' count=3280        ***    -24.98 %       ±5.70%  ±7.59%  ±9.89%
async/async.js test='async' count=3290        ***    -27.70 %       ±6.04%  ±8.05% ±10.52%
async/async.js test='async' count=330                 -3.97 %       ±6.49%  ±8.63% ±11.23%
async/async.js test='async' count=3300        ***    -24.38 %       ±8.19% ±10.96% ±14.39%
async/async.js test='async' count=3310        ***    -25.11 %       ±5.95%  ±7.93% ±10.33%
async/async.js test='async' count=3320        ***    -22.64 %       ±6.50%  ±8.67% ±11.32%
async/async.js test='async' count=3330        ***    -22.04 %       ±6.29%  ±8.37% ±10.91%
async/async.js test='async' count=3340        ***    -23.52 %       ±7.15%  ±9.51% ±12.39%
async/async.js test='async' count=3350        ***    -22.78 %       ±6.31%  ±8.42% ±10.99%
async/async.js test='async' count=3360        ***    -21.85 %       ±6.34%  ±8.45% ±11.02%
async/async.js test='async' count=3370        ***    -22.93 %       ±6.72%  ±8.96% ±11.70%
async/async.js test='async' count=3380        ***    -26.02 %       ±5.73%  ±7.62%  ±9.93%
async/async.js test='async' count=3390        ***    -22.94 %       ±5.94%  ±7.92% ±10.35%
async/async.js test='async' count=340                 -1.06 %       ±7.04%  ±9.37% ±12.19%
async/async.js test='async' count=3400        ***    -22.38 %       ±6.21%  ±8.28% ±10.82%
async/async.js test='async' count=3410        ***    -24.48 %       ±6.27%  ±8.37% ±10.93%
async/async.js test='async' count=3420        ***    -25.20 %       ±6.18%  ±8.24% ±10.75%
async/async.js test='async' count=3430        ***    -21.48 %       ±7.34%  ±9.81% ±12.86%
async/async.js test='async' count=3440        ***    -23.85 %       ±6.52%  ±8.69% ±11.33%
async/async.js test='async' count=3450        ***    -24.83 %       ±6.80%  ±9.05% ±11.79%
async/async.js test='async' count=3460        ***    -23.34 %       ±5.87%  ±7.82% ±10.21%
async/async.js test='async' count=3470        ***    -21.34 %       ±6.05%  ±8.08% ±10.56%
async/async.js test='async' count=3480        ***    -20.79 %       ±6.28%  ±8.37% ±10.92%
async/async.js test='async' count=3490        ***    -22.28 %       ±7.57% ±10.09% ±13.14%
async/async.js test='async' count=350                 -2.37 %       ±7.09%  ±9.44% ±12.29%
async/async.js test='async' count=3500        ***    -20.82 %       ±6.33%  ±8.43% ±11.00%
async/async.js test='async' count=3510        ***    -22.84 %       ±6.02%  ±8.01% ±10.43%
async/async.js test='async' count=3520        ***    -22.86 %       ±6.21%  ±8.26% ±10.76%
async/async.js test='async' count=3530        ***    -21.60 %       ±6.49%  ±8.65% ±11.30%
async/async.js test='async' count=3540        ***    -23.53 %       ±6.19%  ±8.26% ±10.80%
async/async.js test='async' count=3550        ***    -19.17 %       ±5.22%  ±6.95%  ±9.06%
async/async.js test='async' count=3560        ***    -20.79 %       ±6.41%  ±8.54% ±11.14%
async/async.js test='async' count=3570        ***    -19.64 %       ±5.85%  ±7.80% ±10.19%
async/async.js test='async' count=3580        ***    -22.21 %       ±6.58%  ±8.77% ±11.45%
async/async.js test='async' count=3590        ***    -22.06 %       ±6.77%  ±9.02% ±11.79%
async/async.js test='async' count=360                  0.33 %       ±7.39%  ±9.84% ±12.83%
async/async.js test='async' count=3600        ***    -23.19 %       ±5.68%  ±7.56%  ±9.84%
async/async.js test='async' count=3610        ***    -22.15 %       ±6.11%  ±8.13% ±10.59%
async/async.js test='async' count=3620        ***    -21.92 %       ±6.73%  ±8.97% ±11.70%
async/async.js test='async' count=3630        ***    -23.33 %       ±6.60%  ±8.80% ±11.48%
async/async.js test='async' count=3640        ***    -21.35 %       ±6.34%  ±8.46% ±11.07%
async/async.js test='async' count=3650        ***    -19.57 %       ±6.51%  ±8.67% ±11.29%
async/async.js test='async' count=3660        ***    -20.74 %       ±5.99%  ±7.97% ±10.40%
async/async.js test='async' count=3670        ***    -19.21 %       ±5.51%  ±7.34%  ±9.56%
async/async.js test='async' count=3680        ***    -25.15 %       ±6.24%  ±8.30% ±10.81%
async/async.js test='async' count=3690        ***    -28.84 %       ±5.79%  ±7.70% ±10.02%
async/async.js test='async' count=370                 -3.21 %       ±7.76% ±10.32% ±13.44%
async/async.js test='async' count=3700        ***    -30.02 %       ±6.06%  ±8.06% ±10.49%
async/async.js test='async' count=3710        ***    -33.66 %       ±5.97%  ±7.95% ±10.35%
async/async.js test='async' count=3720        ***    -33.14 %       ±6.54%  ±8.72% ±11.39%
async/async.js test='async' count=3730        ***    -36.60 %       ±6.00%  ±8.01% ±10.49%
async/async.js test='async' count=3740        ***    -34.68 %       ±6.42%  ±8.58% ±11.23%
async/async.js test='async' count=3750        ***    -36.18 %       ±5.46%  ±7.28%  ±9.49%
async/async.js test='async' count=3760        ***    -36.00 %       ±5.47%  ±7.29%  ±9.52%
async/async.js test='async' count=3770        ***    -35.39 %       ±5.79%  ±7.72% ±10.08%
async/async.js test='async' count=3780        ***    -36.40 %       ±5.53%  ±7.39%  ±9.66%
async/async.js test='async' count=3790        ***    -34.97 %       ±5.29%  ±7.05%  ±9.20%
async/async.js test='async' count=380                 -2.11 %       ±7.13%  ±9.49% ±12.36%
async/async.js test='async' count=3800        ***    -35.67 %       ±5.28%  ±7.05%  ±9.21%
async/async.js test='async' count=3810        ***    -35.47 %       ±6.08%  ±8.12% ±10.62%
async/async.js test='async' count=3820        ***    -34.62 %       ±6.25%  ±8.33% ±10.87%
async/async.js test='async' count=3830        ***    -35.55 %       ±5.88%  ±7.84% ±10.25%
async/async.js test='async' count=3840        ***    -34.25 %       ±5.26%  ±7.01%  ±9.15%
async/async.js test='async' count=3850        ***    -34.63 %       ±5.29%  ±7.05%  ±9.19%
async/async.js test='async' count=3860        ***    -34.64 %       ±5.52%  ±7.36%  ±9.61%
async/async.js test='async' count=3870        ***    -35.33 %       ±5.84%  ±7.78% ±10.15%
async/async.js test='async' count=3880        ***    -35.76 %       ±5.45%  ±7.28%  ±9.52%
async/async.js test='async' count=3890        ***    -35.71 %       ±6.07%  ±8.09% ±10.58%
async/async.js test='async' count=390                 -0.97 %       ±7.70% ±10.24% ±13.33%
async/async.js test='async' count=3900        ***    -34.32 %       ±5.62%  ±7.50%  ±9.79%
async/async.js test='async' count=3910        ***    -35.36 %       ±5.38%  ±7.16%  ±9.34%
async/async.js test='async' count=3920        ***    -35.61 %       ±5.67%  ±7.55%  ±9.84%
async/async.js test='async' count=3930        ***    -34.87 %       ±5.92%  ±7.90% ±10.32%
async/async.js test='async' count=3940        ***    -35.18 %       ±6.39%  ±8.54% ±11.18%
async/async.js test='async' count=3950        ***    -35.21 %       ±5.78%  ±7.72% ±10.10%
async/async.js test='async' count=3960        ***    -36.70 %       ±5.27%  ±7.03%  ±9.18%
async/async.js test='async' count=3970        ***    -34.23 %       ±6.50%  ±8.70% ±11.43%
async/async.js test='async' count=3980        ***    -33.99 %       ±5.95%  ±7.95% ±10.40%
async/async.js test='async' count=3990        ***    -33.36 %       ±6.04%  ±8.07% ±10.58%
async/async.js test='async' count=40            *      7.44 %       ±6.28%  ±8.35% ±10.87%
async/async.js test='async' count=400                 -1.57 %       ±7.38%  ±9.82% ±12.79%
async/async.js test='async' count=4000        ***    -35.02 %       ±6.86%  ±9.14% ±11.94%
async/async.js test='async' count=4010        ***    -33.47 %       ±5.17%  ±6.89%  ±8.99%
async/async.js test='async' count=4020        ***    -36.36 %       ±6.07%  ±8.12% ±10.65%
async/async.js test='async' count=4030        ***    -34.95 %       ±5.10%  ±6.80%  ±8.88%
async/async.js test='async' count=4040        ***    -35.83 %       ±6.09%  ±8.14% ±10.66%
async/async.js test='async' count=4050        ***    -35.13 %       ±5.84%  ±7.81% ±10.24%
async/async.js test='async' count=4060        ***    -35.38 %       ±5.68%  ±7.58%  ±9.93%
async/async.js test='async' count=4070        ***    -35.95 %       ±5.68%  ±7.58%  ±9.90%
async/async.js test='async' count=4080        ***    -35.75 %       ±5.02%  ±6.69%  ±8.73%
async/async.js test='async' count=4090        ***    -35.82 %       ±5.72%  ±7.62%  ±9.94%
async/async.js test='async' count=410                 -1.33 %       ±7.05%  ±9.38% ±12.21%
async/async.js test='async' count=4100        ***    -36.50 %       ±5.57%  ±7.42%  ±9.68%
async/async.js test='async' count=4110        ***    -35.02 %       ±5.88%  ±7.84% ±10.24%
async/async.js test='async' count=4120        ***    -36.17 %       ±5.44%  ±7.25%  ±9.47%
async/async.js test='async' count=4130        ***    -35.90 %       ±4.98%  ±6.63%  ±8.65%
async/async.js test='async' count=4140        ***    -35.58 %       ±5.39%  ±7.19%  ±9.39%
async/async.js test='async' count=4150        ***    -34.34 %       ±5.40%  ±7.22%  ±9.46%
async/async.js test='async' count=4160        ***    -37.50 %       ±4.82%  ±6.42%  ±8.38%
async/async.js test='async' count=4170        ***    -34.60 %       ±6.03%  ±8.06% ±10.57%
async/async.js test='async' count=4180        ***    -33.48 %       ±5.48%  ±7.30%  ±9.54%
async/async.js test='async' count=4190        ***    -37.80 %       ±5.67%  ±7.55%  ±9.85%
async/async.js test='async' count=420                 -1.98 %       ±6.12%  ±8.14% ±10.59%
async/async.js test='async' count=4200        ***    -36.67 %       ±5.46%  ±7.28%  ±9.52%
async/async.js test='async' count=4210        ***    -36.76 %       ±5.44%  ±7.27%  ±9.50%
async/async.js test='async' count=4220        ***    -37.38 %       ±5.32%  ±7.10%  ±9.31%
async/async.js test='async' count=4230        ***    -36.39 %       ±5.72%  ±7.63%  ±9.99%
async/async.js test='async' count=4240        ***    -36.42 %       ±6.63%  ±8.87% ±11.66%
async/async.js test='async' count=4250        ***    -35.17 %       ±5.44%  ±7.26%  ±9.51%
async/async.js test='async' count=4260        ***    -35.88 %       ±4.99%  ±6.66%  ±8.70%
async/async.js test='async' count=4270        ***    -36.21 %       ±5.55%  ±7.42%  ±9.71%
async/async.js test='async' count=4280        ***    -36.57 %       ±6.10%  ±8.14% ±10.66%
async/async.js test='async' count=4290        ***    -37.86 %       ±5.39%  ±7.19%  ±9.39%
async/async.js test='async' count=430                 -3.16 %       ±7.09%  ±9.43% ±12.27%
async/async.js test='async' count=4300        ***    -38.30 %       ±5.42%  ±7.22%  ±9.42%
async/async.js test='async' count=4310        ***    -35.84 %       ±5.65%  ±7.53%  ±9.82%
async/async.js test='async' count=4320        ***    -35.71 %       ±5.13%  ±6.84%  ±8.92%
async/async.js test='async' count=4330        ***    -36.04 %       ±6.06%  ±8.10% ±10.61%
async/async.js test='async' count=4340        ***    -38.42 %       ±5.71%  ±7.62%  ±9.95%
async/async.js test='async' count=4350        ***    -36.57 %       ±5.58%  ±7.45%  ±9.75%
async/async.js test='async' count=4360        ***    -36.37 %       ±5.14%  ±6.86%  ±8.99%
async/async.js test='async' count=4370        ***    -35.82 %       ±6.14%  ±8.19% ±10.72%
async/async.js test='async' count=4380        ***    -36.79 %       ±6.71%  ±8.96% ±11.72%
async/async.js test='async' count=4390        ***    -36.65 %       ±5.82%  ±7.76% ±10.15%
async/async.js test='async' count=440                 -1.72 %       ±6.83%  ±9.09% ±11.84%
async/async.js test='async' count=4400        ***    -38.26 %       ±5.15%  ±6.87%  ±8.99%
async/async.js test='async' count=4410        ***    -36.95 %       ±5.37%  ±7.16%  ±9.36%
async/async.js test='async' count=4420        ***    -34.26 %       ±5.37%  ±7.17%  ±9.39%
async/async.js test='async' count=4430        ***    -37.08 %       ±5.45%  ±7.27%  ±9.49%
async/async.js test='async' count=4440        ***    -36.47 %       ±5.66%  ±7.55%  ±9.86%
async/async.js test='async' count=4450        ***    -36.40 %       ±5.42%  ±7.23%  ±9.44%
async/async.js test='async' count=4460        ***    -37.50 %       ±5.60%  ±7.48%  ±9.79%
async/async.js test='async' count=4470        ***    -38.04 %       ±5.76%  ±7.69% ±10.04%
async/async.js test='async' count=4480        ***    -34.50 %       ±5.05%  ±6.73%  ±8.78%
async/async.js test='async' count=4490        ***    -36.02 %       ±6.01%  ±8.01% ±10.46%
async/async.js test='async' count=450                 -2.00 %       ±7.08%  ±9.42% ±12.27%
async/async.js test='async' count=4500        ***    -36.50 %       ±5.57%  ±7.44%  ±9.74%
async/async.js test='async' count=4510        ***    -35.90 %       ±5.83%  ±7.77% ±10.16%
async/async.js test='async' count=4520        ***    -34.61 %       ±5.93%  ±7.92% ±10.36%
async/async.js test='async' count=4530        ***    -35.97 %       ±5.42%  ±7.23%  ±9.45%
async/async.js test='async' count=4540        ***    -35.54 %       ±6.70%  ±8.95% ±11.74%
async/async.js test='async' count=4550        ***    -37.56 %       ±5.25%  ±7.01%  ±9.15%
async/async.js test='async' count=4560        ***    -36.65 %       ±5.37%  ±7.16%  ±9.34%
async/async.js test='async' count=4570        ***    -36.30 %       ±5.93%  ±7.92% ±10.37%
async/async.js test='async' count=4580        ***    -36.61 %       ±5.69%  ±7.60%  ±9.94%
async/async.js test='async' count=4590        ***    -35.51 %       ±5.60%  ±7.48%  ±9.79%
async/async.js test='async' count=460                  0.15 %       ±7.90% ±10.53% ±13.76%
async/async.js test='async' count=4600        ***    -38.34 %       ±5.51%  ±7.34%  ±9.60%
async/async.js test='async' count=4610        ***    -36.94 %       ±5.85%  ±7.80% ±10.18%
async/async.js test='async' count=4620        ***    -37.92 %       ±5.45%  ±7.26%  ±9.47%
async/async.js test='async' count=4630        ***    -34.83 %       ±5.47%  ±7.30%  ±9.53%
async/async.js test='async' count=4640        ***    -36.24 %       ±5.75%  ±7.67% ±10.00%
async/async.js test='async' count=4650        ***    -36.66 %       ±5.11%  ±6.82%  ±8.92%
async/async.js test='async' count=4660        ***    -36.12 %       ±5.84%  ±7.79% ±10.18%
async/async.js test='async' count=4670        ***    -34.81 %       ±6.45%  ±8.62% ±11.30%
async/async.js test='async' count=4680        ***    -34.76 %       ±5.80%  ±7.72% ±10.07%
async/async.js test='async' count=4690        ***    -31.11 %       ±8.53% ±11.43% ±15.01%
async/async.js test='async' count=470                 -2.75 %       ±7.58% ±10.09% ±13.14%
async/async.js test='async' count=4700        ***    -30.02 %       ±8.29% ±11.10% ±14.58%
async/async.js test='async' count=4710        ***    -29.71 %       ±8.53% ±11.42% ±15.01%
async/async.js test='async' count=4720        ***    -21.97 %      ±11.36% ±15.23% ±20.07%
async/async.js test='async' count=4730                -6.57 %       ±9.74% ±13.02% ±17.06%
async/async.js test='async' count=4740                 1.58 %       ±7.37%  ±9.82% ±12.79%
async/async.js test='async' count=4750                -7.14 %       ±7.43%  ±9.92% ±12.97%
async/async.js test='async' count=4760                -1.07 %       ±6.91%  ±9.19% ±11.97%
async/async.js test='async' count=4770                -2.42 %       ±8.18% ±10.90% ±14.21%
async/async.js test='async' count=4780                -1.29 %       ±7.25%  ±9.67% ±12.62%
async/async.js test='async' count=4790                -2.26 %       ±6.42%  ±8.54% ±11.12%
async/async.js test='async' count=480                 -3.63 %       ±6.99%  ±9.30% ±12.12%
async/async.js test='async' count=4800                -0.98 %       ±7.15%  ±9.52% ±12.40%
async/async.js test='async' count=4810                 1.81 %       ±6.75%  ±8.99% ±11.69%
async/async.js test='async' count=4820                -0.48 %       ±6.53%  ±8.68% ±11.30%
async/async.js test='async' count=4830                -1.55 %       ±6.43%  ±8.56% ±11.14%
async/async.js test='async' count=4840                 0.17 %       ±7.16%  ±9.53% ±12.41%
async/async.js test='async' count=4850                -2.77 %       ±6.52%  ±8.67% ±11.29%
async/async.js test='async' count=4860                -2.27 %       ±6.50%  ±8.65% ±11.26%
async/async.js test='async' count=4870                -1.30 %       ±6.33%  ±8.43% ±10.97%
async/async.js test='async' count=4880                -0.69 %       ±6.67%  ±8.88% ±11.57%
async/async.js test='async' count=4890                 1.13 %       ±6.99%  ±9.30% ±12.12%
async/async.js test='async' count=490                 -4.03 %       ±6.96%  ±9.27% ±12.07%
async/async.js test='async' count=4900                -0.12 %       ±6.60%  ±8.78% ±11.43%
async/async.js test='async' count=4910                -2.61 %       ±6.42%  ±8.55% ±11.13%
async/async.js test='async' count=4920                 0.50 %       ±6.88%  ±9.15% ±11.91%
async/async.js test='async' count=4930                -2.35 %       ±6.61%  ±8.80% ±11.45%
async/async.js test='async' count=4940                -1.75 %       ±6.82%  ±9.08% ±11.83%
async/async.js test='async' count=4950                -5.60 %       ±6.85%  ±9.12% ±11.87%
async/async.js test='async' count=4960                 0.65 %       ±6.53%  ±8.69% ±11.32%
async/async.js test='async' count=4970                 1.87 %       ±6.06%  ±8.07% ±10.50%
async/async.js test='async' count=4980                 0.00 %       ±6.44%  ±8.57% ±11.16%
async/async.js test='async' count=4990          *      8.43 %       ±6.72%  ±8.95% ±11.64%
async/async.js test='async' count=50                   5.84 %       ±6.94%  ±9.24% ±12.04%
async/async.js test='async' count=500                 -1.21 %       ±6.12%  ±8.15% ±10.62%
async/async.js test='async' count=5000        ***     13.09 %       ±6.66%  ±8.86% ±11.53%
async/async.js test='async' count=5010         **     10.54 %       ±6.87%  ±9.14% ±11.90%
async/async.js test='async' count=5020                 2.22 %       ±7.55% ±10.05% ±13.08%
async/async.js test='async' count=5030                -2.72 %       ±6.75%  ±8.98% ±11.68%
async/async.js test='async' count=5040                -0.20 %       ±8.02% ±10.68% ±13.90%
async/async.js test='async' count=5050                -1.04 %       ±6.81%  ±9.06% ±11.79%
async/async.js test='async' count=5060                -1.69 %       ±6.80%  ±9.04% ±11.77%
async/async.js test='async' count=5070                -0.64 %       ±5.99%  ±7.97% ±10.38%
async/async.js test='async' count=5080                -1.92 %       ±6.75%  ±8.98% ±11.69%
async/async.js test='async' count=5090                 0.14 %       ±7.41%  ±9.87% ±12.85%
async/async.js test='async' count=510           *     -7.59 %       ±7.49%  ±9.97% ±12.99%
async/async.js test='async' count=5100                -0.57 %       ±6.73%  ±8.95% ±11.65%
async/async.js test='async' count=5110                -3.74 %       ±6.55%  ±8.72% ±11.35%
async/async.js test='async' count=5120                -1.21 %       ±7.41%  ±9.85% ±12.82%
async/async.js test='async' count=5130                -1.10 %       ±6.99%  ±9.30% ±12.11%
async/async.js test='async' count=5140                 0.33 %       ±6.57%  ±8.74% ±11.38%
async/async.js test='async' count=5150                 3.22 %       ±7.34%  ±9.77% ±12.71%
async/async.js test='async' count=5160                 2.13 %       ±7.39%  ±9.84% ±12.82%
async/async.js test='async' count=5170                 2.22 %       ±7.08%  ±9.42% ±12.26%
async/async.js test='async' count=5180                -0.53 %       ±6.98%  ±9.29% ±12.10%
async/async.js test='async' count=5190                 1.22 %       ±8.14% ±10.83% ±14.10%
async/async.js test='async' count=520                 -3.13 %       ±6.72%  ±8.95% ±11.65%
async/async.js test='async' count=5200                -1.80 %       ±7.92% ±10.54% ±13.73%
async/async.js test='async' count=5210                -0.83 %       ±7.02%  ±9.33% ±12.15%
async/async.js test='async' count=5220                 0.79 %       ±7.01%  ±9.32% ±12.14%
async/async.js test='async' count=5230                -0.29 %       ±7.63% ±10.16% ±13.25%
async/async.js test='async' count=5240                -2.44 %       ±7.27%  ±9.67% ±12.59%
async/async.js test='async' count=5250                 1.05 %       ±7.86% ±10.46% ±13.62%
async/async.js test='async' count=5260                -0.21 %       ±7.38%  ±9.82% ±12.79%
async/async.js test='async' count=5270                 0.05 %       ±7.53% ±10.02% ±13.05%
async/async.js test='async' count=5280                -2.46 %       ±6.94%  ±9.24% ±12.04%
async/async.js test='async' count=5290                -0.67 %       ±7.34%  ±9.77% ±12.72%
async/async.js test='async' count=530                 -4.36 %       ±8.61% ±11.45% ±14.91%
async/async.js test='async' count=5300                 0.15 %       ±7.08%  ±9.43% ±12.28%
async/async.js test='async' count=5310                 2.40 %       ±7.24%  ±9.64% ±12.55%
async/async.js test='async' count=5320                -1.10 %       ±7.26%  ±9.67% ±12.58%
async/async.js test='async' count=5330                -1.31 %       ±7.90% ±10.51% ±13.69%
async/async.js test='async' count=5340                -1.86 %       ±6.71%  ±8.93% ±11.63%
async/async.js test='async' count=5350                -2.93 %       ±7.12%  ±9.47% ±12.33%
async/async.js test='async' count=5360                 0.86 %       ±7.57% ±10.07% ±13.11%
async/async.js test='async' count=5370                -0.75 %       ±8.16% ±10.86% ±14.14%
async/async.js test='async' count=5380                -1.19 %       ±7.31%  ±9.73% ±12.68%
async/async.js test='async' count=5390                 1.65 %       ±7.62% ±10.14% ±13.20%
async/async.js test='async' count=540                 -0.46 %       ±8.22% ±10.96% ±14.33%
async/async.js test='async' count=5400                -2.90 %       ±6.97%  ±9.27% ±12.06%
async/async.js test='async' count=5410                -0.96 %       ±6.80%  ±9.04% ±11.77%
async/async.js test='async' count=5420                 1.49 %       ±6.44%  ±8.57% ±11.16%
async/async.js test='async' count=5430                -0.34 %       ±6.97%  ±9.28% ±12.08%
async/async.js test='async' count=5440                 0.55 %       ±6.99%  ±9.29% ±12.10%
async/async.js test='async' count=5450                -1.51 %       ±6.77%  ±9.01% ±11.73%
async/async.js test='async' count=5460                 0.00 %       ±7.33%  ±9.75% ±12.69%
async/async.js test='async' count=5470                 2.78 %       ±7.53% ±10.01% ±13.03%
async/async.js test='async' count=5480                 0.24 %       ±8.23% ±10.95% ±14.26%
async/async.js test='async' count=5490                 1.99 %       ±7.67% ±10.20% ±13.28%
async/async.js test='async' count=550                  0.61 %       ±7.53% ±10.03% ±13.07%
async/async.js test='async' count=5500                -0.35 %       ±8.41% ±11.20% ±14.57%
async/async.js test='async' count=5510                 0.47 %       ±7.53% ±10.02% ±13.04%
async/async.js test='async' count=5520                -1.22 %       ±7.56% ±10.06% ±13.09%
async/async.js test='async' count=5530                -1.23 %       ±7.19%  ±9.57% ±12.46%
async/async.js test='async' count=5540                 1.48 %       ±7.64% ±10.17% ±13.24%
async/async.js test='async' count=5550                -1.25 %       ±7.15%  ±9.52% ±12.39%
async/async.js test='async' count=5560                 1.28 %       ±7.31%  ±9.72% ±12.66%
async/async.js test='async' count=5570                -0.00 %       ±7.80% ±10.38% ±13.51%
async/async.js test='async' count=5580                 0.32 %       ±7.45%  ±9.91% ±12.91%
async/async.js test='async' count=5590                 3.13 %       ±7.48%  ±9.96% ±12.96%
async/async.js test='async' count=560                 -3.63 %       ±6.93%  ±9.22% ±12.00%
async/async.js test='async' count=5600                 1.55 %       ±7.11%  ±9.46% ±12.32%
async/async.js test='async' count=5610                 4.92 %       ±7.07%  ±9.41% ±12.24%
async/async.js test='async' count=5620                 0.19 %       ±7.08%  ±9.41% ±12.25%
async/async.js test='async' count=5630                 2.32 %       ±7.63% ±10.15% ±13.21%
async/async.js test='async' count=5640                 3.63 %       ±7.43%  ±9.88% ±12.87%
async/async.js test='async' count=5650                 5.63 %       ±7.27%  ±9.67% ±12.58%
async/async.js test='async' count=5660                -0.22 %       ±7.42%  ±9.87% ±12.84%
async/async.js test='async' count=5670                 2.14 %       ±7.47%  ±9.94% ±12.95%
async/async.js test='async' count=5680                 2.93 %       ±7.10%  ±9.45% ±12.31%
async/async.js test='async' count=5690                 1.11 %       ±7.04%  ±9.37% ±12.20%
async/async.js test='async' count=570                 -3.47 %       ±6.28%  ±8.36% ±10.89%
async/async.js test='async' count=5700                 2.24 %       ±7.46%  ±9.92% ±12.93%
async/async.js test='async' count=5710                 1.52 %       ±7.91% ±10.53% ±13.70%
async/async.js test='async' count=5720                 2.20 %       ±7.30%  ±9.71% ±12.65%
async/async.js test='async' count=5730                 4.05 %       ±6.98%  ±9.29% ±12.09%
async/async.js test='async' count=5740                 5.07 %       ±7.60% ±10.12% ±13.21%
async/async.js test='async' count=5750                 3.97 %       ±7.55% ±10.05% ±13.09%
async/async.js test='async' count=5760                 2.00 %       ±6.99%  ±9.30% ±12.10%
async/async.js test='async' count=5770                 1.75 %       ±6.90%  ±9.18% ±11.95%
async/async.js test='async' count=5780                 2.92 %       ±7.29%  ±9.71% ±12.64%
async/async.js test='async' count=5790                 2.72 %       ±7.05%  ±9.38% ±12.21%
async/async.js test='async' count=580                 -2.69 %       ±6.98%  ±9.29% ±12.10%
async/async.js test='async' count=5800                 2.87 %       ±7.15%  ±9.52% ±12.41%
async/async.js test='async' count=5810                 3.50 %       ±7.68% ±10.24% ±13.37%
async/async.js test='async' count=5820                 1.96 %       ±7.27%  ±9.68% ±12.60%
async/async.js test='async' count=5830                -0.25 %       ±7.35%  ±9.78% ±12.73%
async/async.js test='async' count=5840                 2.78 %       ±7.04%  ±9.38% ±12.21%
async/async.js test='async' count=5850                 3.28 %       ±7.08%  ±9.42% ±12.26%
async/async.js test='async' count=5860                -1.29 %       ±6.91%  ±9.20% ±11.98%
async/async.js test='async' count=5870                 2.67 %       ±7.04%  ±9.37% ±12.20%
async/async.js test='async' count=5880                 4.11 %       ±7.15%  ±9.51% ±12.38%
async/async.js test='async' count=5890                 4.88 %       ±7.44%  ±9.90% ±12.89%
async/async.js test='async' count=590           *     -8.62 %       ±6.61%  ±8.79% ±11.44%
async/async.js test='async' count=5900                 2.76 %       ±7.07%  ±9.40% ±12.24%
async/async.js test='async' count=5910                 6.88 %       ±8.04% ±10.70% ±13.93%
async/async.js test='async' count=5920                 1.96 %       ±7.61% ±10.13% ±13.19%
async/async.js test='async' count=5930                 2.04 %       ±7.19%  ±9.57% ±12.46%
async/async.js test='async' count=5940                 0.33 %       ±7.82% ±10.41% ±13.56%
async/async.js test='async' count=5950                 1.94 %       ±6.77%  ±9.00% ±11.72%
async/async.js test='async' count=5960                 2.63 %       ±6.68%  ±8.89% ±11.57%
async/async.js test='async' count=5970                 0.80 %       ±6.62%  ±8.80% ±11.46%
async/async.js test='async' count=5980                 1.76 %       ±6.66%  ±8.86% ±11.53%
async/async.js test='async' count=5990                -0.03 %       ±6.24%  ±8.30% ±10.82%
async/async.js test='async' count=60                   5.38 %       ±6.02%  ±8.01% ±10.42%
async/async.js test='async' count=600                 -4.67 %       ±7.16%  ±9.53% ±12.40%
async/async.js test='async' count=6000                 1.26 %       ±6.85%  ±9.11% ±11.86%
async/async.js test='async' count=6010                -0.85 %       ±6.49%  ±8.63% ±11.24%
async/async.js test='async' count=6020                 2.25 %       ±6.33%  ±8.42% ±10.96%
async/async.js test='async' count=6030                 2.10 %       ±6.32%  ±8.41% ±10.95%
async/async.js test='async' count=6040                 1.24 %       ±6.32%  ±8.42% ±10.96%
async/async.js test='async' count=6050                 0.61 %       ±6.90%  ±9.18% ±11.95%
async/async.js test='async' count=6060                 3.04 %       ±6.02%  ±8.01% ±10.42%
async/async.js test='async' count=6070                 3.57 %       ±6.54%  ±8.70% ±11.32%
async/async.js test='async' count=6080                 1.00 %       ±6.93%  ±9.22% ±12.00%
async/async.js test='async' count=6090                 1.72 %       ±6.54%  ±8.70% ±11.33%
async/async.js test='async' count=610                 -3.76 %       ±5.78%  ±7.70% ±10.03%
async/async.js test='async' count=6100                 3.38 %       ±6.29%  ±8.37% ±10.89%
async/async.js test='async' count=6110                 0.01 %       ±6.19%  ±8.23% ±10.71%
async/async.js test='async' count=6120                 2.76 %       ±6.89%  ±9.17% ±11.94%
async/async.js test='async' count=6130                -1.09 %       ±7.74% ±10.30% ±13.42%
async/async.js test='async' count=6140                 1.60 %       ±7.05%  ±9.38% ±12.21%
async/async.js test='async' count=6150                 2.32 %       ±7.68% ±10.22% ±13.31%
async/async.js test='async' count=6160                 2.97 %       ±6.94%  ±9.23% ±12.01%
async/async.js test='async' count=6170                 0.26 %       ±7.55% ±10.04% ±13.07%
async/async.js test='async' count=6180                 1.39 %       ±6.61%  ±8.79% ±11.45%
async/async.js test='async' count=6190                -0.22 %       ±7.54% ±10.04% ±13.08%
async/async.js test='async' count=620                 -4.88 %       ±6.59%  ±8.76% ±11.41%
async/async.js test='async' count=6200                 1.79 %       ±6.48%  ±8.63% ±11.23%
async/async.js test='async' count=6210                 1.45 %       ±6.80%  ±9.05% ±11.77%
async/async.js test='async' count=6220                 1.54 %       ±6.79%  ±9.03% ±11.75%
async/async.js test='async' count=6230                 2.94 %       ±6.38%  ±8.49% ±11.06%
async/async.js test='async' count=6240                 0.26 %       ±6.50%  ±8.65% ±11.26%
async/async.js test='async' count=6250                 3.35 %       ±6.53%  ±8.69% ±11.31%
async/async.js test='async' count=6260                 4.03 %       ±6.81%  ±9.06% ±11.80%
async/async.js test='async' count=6270                 2.07 %       ±5.90%  ±7.86% ±10.23%
async/async.js test='async' count=6280                 1.90 %       ±7.10%  ±9.45% ±12.31%
async/async.js test='async' count=6290                 3.90 %       ±7.28%  ±9.69% ±12.61%
async/async.js test='async' count=630                  0.00 %       ±8.15% ±10.84% ±14.13%
async/async.js test='async' count=6300                 0.75 %       ±6.79%  ±9.03% ±11.75%
async/async.js test='async' count=6310                 0.24 %       ±7.17%  ±9.53% ±12.41%
async/async.js test='async' count=6320                 2.32 %       ±6.04%  ±8.04% ±10.47%
async/async.js test='async' count=6330                 3.48 %       ±7.23%  ±9.63% ±12.53%
async/async.js test='async' count=6340                 2.55 %       ±6.19%  ±8.24% ±10.73%
async/async.js test='async' count=6350                 2.28 %       ±6.00%  ±7.98% ±10.39%
async/async.js test='async' count=6360                 3.01 %       ±7.24%  ±9.64% ±12.55%
async/async.js test='async' count=6370                 2.73 %       ±6.34%  ±8.43% ±10.98%
async/async.js test='async' count=6380                 0.69 %       ±6.70%  ±8.91% ±11.60%
async/async.js test='async' count=6390                 1.56 %       ±5.77%  ±7.67%  ±9.98%
async/async.js test='async' count=640                 -5.44 %       ±6.45%  ±8.58% ±11.18%
async/async.js test='async' count=6400                 4.53 %       ±6.53%  ±8.68% ±11.30%
async/async.js test='async' count=6410                 5.12 %       ±6.20%  ±8.25% ±10.74%
async/async.js test='async' count=6420                 1.01 %       ±5.82%  ±7.74% ±10.08%
async/async.js test='async' count=6430                 2.35 %       ±6.11%  ±8.13% ±10.58%
async/async.js test='async' count=6440                 1.01 %       ±6.21%  ±8.27% ±10.76%
async/async.js test='async' count=6450                 3.33 %       ±6.63%  ±8.83% ±11.49%
async/async.js test='async' count=6460                 0.19 %       ±7.52% ±10.00% ±13.02%
async/async.js test='async' count=6470                 5.65 %       ±8.90% ±11.84% ±15.42%
async/async.js test='async' count=6480                 0.67 %       ±6.42%  ±8.56% ±11.16%
async/async.js test='async' count=6490                 6.30 %       ±7.31%  ±9.72% ±12.65%
async/async.js test='async' count=650                 -4.94 %       ±6.45%  ±8.58% ±11.18%
async/async.js test='async' count=6500                 5.18 %       ±6.73%  ±8.95% ±11.65%
async/async.js test='async' count=6510                 6.19 %       ±7.19%  ±9.57% ±12.46%
async/async.js test='async' count=6520          *      6.79 %       ±5.88%  ±7.83% ±10.19%
async/async.js test='async' count=6530                 5.17 %       ±6.74%  ±8.98% ±11.72%
async/async.js test='async' count=6540                 2.99 %       ±6.30%  ±8.39% ±10.93%
async/async.js test='async' count=6550                 4.87 %       ±6.42%  ±8.54% ±11.12%
async/async.js test='async' count=6560                 3.65 %       ±6.36%  ±8.47% ±11.03%
async/async.js test='async' count=6570                 6.24 %       ±7.15%  ±9.51% ±12.39%
async/async.js test='async' count=6580                 1.43 %       ±5.62%  ±7.48%  ±9.74%
async/async.js test='async' count=6590                 1.62 %       ±6.08%  ±8.09% ±10.53%
async/async.js test='async' count=660                 -5.78 %       ±6.18%  ±8.22% ±10.71%
async/async.js test='async' count=6600                 4.31 %       ±6.95%  ±9.24% ±12.03%
async/async.js test='async' count=6610                 4.07 %       ±6.30%  ±8.38% ±10.90%
async/async.js test='async' count=6620                 4.12 %       ±5.71%  ±7.60%  ±9.89%
async/async.js test='async' count=6630                 2.31 %       ±6.99%  ±9.30% ±12.11%
async/async.js test='async' count=6640                 0.13 %       ±6.10%  ±8.12% ±10.57%
async/async.js test='async' count=6650                 3.16 %       ±5.92%  ±7.87% ±10.25%
async/async.js test='async' count=6660                 3.67 %       ±6.99%  ±9.30% ±12.10%
async/async.js test='async' count=6670                 2.90 %       ±6.09%  ±8.10% ±10.55%
async/async.js test='async' count=6680                 5.69 %       ±6.29%  ±8.37% ±10.90%
async/async.js test='async' count=6690                 3.61 %       ±5.86%  ±7.79% ±10.14%
async/async.js test='async' count=670                 -5.48 %       ±7.25%  ±9.66% ±12.58%
async/async.js test='async' count=6700                 3.54 %       ±6.39%  ±8.50% ±11.07%
async/async.js test='async' count=6710                 4.97 %       ±6.32%  ±8.42% ±10.95%
async/async.js test='async' count=6720                 5.48 %       ±6.57%  ±8.75% ±11.40%
async/async.js test='async' count=6730                 5.16 %       ±6.64%  ±8.84% ±11.51%
async/async.js test='async' count=6740                 2.64 %       ±6.79%  ±9.03% ±11.75%
async/async.js test='async' count=6750                 5.11 %       ±6.53%  ±8.69% ±11.31%
async/async.js test='async' count=6760                 4.77 %       ±6.17%  ±8.21% ±10.68%
async/async.js test='async' count=6770                 3.49 %       ±6.49%  ±8.64% ±11.25%
async/async.js test='async' count=6780                 3.50 %       ±5.91%  ±7.87% ±10.24%
async/async.js test='async' count=6790                 4.33 %       ±6.26%  ±8.34% ±10.85%
async/async.js test='async' count=680                 -5.91 %       ±6.63%  ±8.82% ±11.49%
async/async.js test='async' count=6800                 1.79 %       ±6.65%  ±8.85% ±11.52%
async/async.js test='async' count=6810                 1.83 %       ±6.61%  ±8.79% ±11.45%
async/async.js test='async' count=6820                 3.37 %       ±7.74% ±10.30% ±13.41%
async/async.js test='async' count=6830                 4.97 %       ±6.34%  ±8.43% ±10.98%
async/async.js test='async' count=6840                -0.01 %       ±8.20% ±10.92% ±14.22%
async/async.js test='async' count=6850                 2.10 %       ±6.38%  ±8.48% ±11.04%
async/async.js test='async' count=6860                 2.02 %       ±5.91%  ±7.88% ±10.28%
async/async.js test='async' count=6870                 3.36 %       ±6.95%  ±9.24% ±12.03%
async/async.js test='async' count=6880                 3.27 %       ±7.51% ±10.00% ±13.04%
async/async.js test='async' count=6890                -0.20 %       ±6.96%  ±9.26% ±12.06%
async/async.js test='async' count=690                 -6.35 %       ±6.92%  ±9.21% ±11.99%
async/async.js test='async' count=6900                 1.63 %       ±7.03%  ±9.36% ±12.19%
async/async.js test='async' count=6910                 1.82 %       ±6.36%  ±8.47% ±11.02%
async/async.js test='async' count=6920                 4.29 %       ±6.28%  ±8.36% ±10.88%
async/async.js test='async' count=6930                 1.20 %       ±6.76%  ±9.00% ±11.71%
async/async.js test='async' count=6940                 3.02 %       ±6.94%  ±9.24% ±12.03%
async/async.js test='async' count=6950                 2.33 %       ±6.14%  ±8.16% ±10.63%
async/async.js test='async' count=6960                 0.85 %       ±6.56%  ±8.73% ±11.36%
async/async.js test='async' count=6970                 2.95 %       ±6.24%  ±8.31% ±10.81%
async/async.js test='async' count=6980                 4.20 %       ±5.93%  ±7.88% ±10.26%
async/async.js test='async' count=6990                 4.70 %       ±6.79%  ±9.04% ±11.77%
async/async.js test='async' count=70            *      8.13 %       ±7.04%  ±9.37% ±12.20%
async/async.js test='async' count=700                 -4.71 %       ±7.12%  ±9.47% ±12.33%
async/async.js test='async' count=7000                 4.00 %       ±6.42%  ±8.54% ±11.11%
async/async.js test='async' count=7010                 3.00 %       ±6.93%  ±9.22% ±12.00%
async/async.js test='async' count=7020                 2.15 %       ±7.03%  ±9.35% ±12.18%
async/async.js test='async' count=7030                 1.26 %       ±7.07%  ±9.41% ±12.25%
async/async.js test='async' count=7040                 0.16 %       ±7.18%  ±9.56% ±12.45%
async/async.js test='async' count=7050                 0.89 %       ±6.58%  ±8.76% ±11.40%
async/async.js test='async' count=7060                 1.12 %       ±6.92%  ±9.21% ±11.99%
async/async.js test='async' count=7070                 1.56 %       ±6.88%  ±9.16% ±11.95%
async/async.js test='async' count=7080                 0.29 %       ±7.08%  ±9.43% ±12.27%
async/async.js test='async' count=7090                 0.61 %       ±7.14%  ±9.50% ±12.36%
async/async.js test='async' count=710          **     -9.02 %       ±6.36%  ±8.46% ±11.02%
async/async.js test='async' count=7100                 2.34 %       ±6.86%  ±9.13% ±11.90%
async/async.js test='async' count=7110                -2.13 %       ±6.45%  ±8.59% ±11.17%
async/async.js test='async' count=7120                 3.02 %       ±6.24%  ±8.30% ±10.80%
async/async.js test='async' count=7130                 1.17 %       ±7.10%  ±9.44% ±12.29%
async/async.js test='async' count=7140                 1.63 %       ±6.73%  ±8.96% ±11.66%
async/async.js test='async' count=7150                 4.64 %       ±6.68%  ±8.90% ±11.58%
async/async.js test='async' count=7160                 3.65 %       ±6.70%  ±8.91% ±11.60%
async/async.js test='async' count=7170                 3.03 %       ±6.36%  ±8.46% ±11.01%
async/async.js test='async' count=7180                 2.02 %       ±7.84% ±10.43% ±13.57%
async/async.js test='async' count=7190                 1.60 %       ±6.60%  ±8.79% ±11.44%
async/async.js test='async' count=720                 -6.62 %       ±7.40%  ±9.86% ±12.86%
async/async.js test='async' count=7200                 1.40 %       ±6.42%  ±8.55% ±11.13%
async/async.js test='async' count=7210                 4.25 %       ±6.72%  ±8.94% ±11.64%
async/async.js test='async' count=7220                 4.08 %       ±6.92%  ±9.21% ±11.98%
async/async.js test='async' count=7230                 1.94 %       ±6.36%  ±8.47% ±11.02%
async/async.js test='async' count=7240                 0.34 %       ±6.57%  ±8.75% ±11.39%
async/async.js test='async' count=7250                 0.70 %       ±6.98%  ±9.29% ±12.10%
async/async.js test='async' count=7260                 1.74 %       ±6.91%  ±9.19% ±11.96%
async/async.js test='async' count=7270                -0.36 %       ±6.01%  ±8.00% ±10.41%
async/async.js test='async' count=7280                 4.76 %       ±6.34%  ±8.43% ±10.98%
async/async.js test='async' count=7290                 2.12 %       ±6.77%  ±9.01% ±11.72%
async/async.js test='async' count=730                 -6.59 %       ±6.84%  ±9.10% ±11.85%
async/async.js test='async' count=7300                 1.32 %       ±6.25%  ±8.32% ±10.83%
async/async.js test='async' count=7310                 2.16 %       ±6.39%  ±8.50% ±11.06%
async/async.js test='async' count=7320                -0.62 %       ±7.25%  ±9.65% ±12.57%
async/async.js test='async' count=7330                 1.65 %       ±6.16%  ±8.20% ±10.67%
async/async.js test='async' count=7340                -0.29 %       ±6.94%  ±9.23% ±12.02%
async/async.js test='async' count=7350                -0.27 %       ±5.96%  ±7.93% ±10.33%
async/async.js test='async' count=7360                 1.44 %       ±6.31%  ±8.40% ±10.93%
async/async.js test='async' count=7370                 0.80 %       ±6.33%  ±8.43% ±10.97%
async/async.js test='async' count=7380                 2.02 %       ±6.56%  ±8.73% ±11.36%
async/async.js test='async' count=7390                -0.23 %       ±6.71%  ±8.92% ±11.61%
async/async.js test='async' count=740                 -4.66 %       ±6.80%  ±9.07% ±11.83%
async/async.js test='async' count=7400                 1.65 %       ±6.25%  ±8.32% ±10.84%
async/async.js test='async' count=7410                 1.49 %       ±6.09%  ±8.10% ±10.55%
async/async.js test='async' count=7420                 3.56 %       ±6.56%  ±8.72% ±11.35%
async/async.js test='async' count=7430                 0.83 %       ±6.08%  ±8.10% ±10.54%
async/async.js test='async' count=7440                 2.76 %       ±6.26%  ±8.32% ±10.84%
async/async.js test='async' count=7450                -0.37 %       ±5.62%  ±7.48%  ±9.73%
async/async.js test='async' count=7460                 2.65 %       ±6.16%  ±8.20% ±10.67%
async/async.js test='async' count=7470                 0.33 %       ±6.20%  ±8.25% ±10.74%
async/async.js test='async' count=7480                 3.08 %       ±6.55%  ±8.72% ±11.35%
async/async.js test='async' count=7490                 1.96 %       ±5.82%  ±7.74% ±10.07%
async/async.js test='async' count=750                 -6.31 %       ±7.59% ±10.12% ±13.21%
async/async.js test='async' count=7500                 4.61 %       ±6.40%  ±8.52% ±11.09%
async/async.js test='async' count=7510                 2.94 %       ±6.02%  ±8.00% ±10.42%
async/async.js test='async' count=7520                 1.07 %       ±5.92%  ±7.88% ±10.26%
async/async.js test='async' count=7530                 4.73 %       ±6.22%  ±8.28% ±10.78%
async/async.js test='async' count=7540                 3.24 %       ±5.80%  ±7.72% ±10.05%
async/async.js test='async' count=7550                 1.87 %       ±6.75%  ±8.98% ±11.69%
async/async.js test='async' count=7560                 2.04 %       ±6.02%  ±8.01% ±10.43%
async/async.js test='async' count=7570                 0.98 %       ±5.67%  ±7.55%  ±9.82%
async/async.js test='async' count=7580                 1.01 %       ±5.74%  ±7.63%  ±9.94%
async/async.js test='async' count=7590                 1.18 %       ±5.98%  ±7.96% ±10.35%
async/async.js test='async' count=760          **    -12.35 %       ±7.14%  ±9.50% ±12.36%
async/async.js test='async' count=7600                 0.83 %       ±6.55%  ±8.71% ±11.34%
async/async.js test='async' count=7610                 0.35 %       ±6.75%  ±8.98% ±11.69%
async/async.js test='async' count=7620                 1.90 %       ±6.31%  ±8.39% ±10.93%
async/async.js test='async' count=7630                 1.75 %       ±5.57%  ±7.42%  ±9.66%
async/async.js test='async' count=7640                 0.99 %       ±6.20%  ±8.25% ±10.74%
async/async.js test='async' count=7650                 3.03 %       ±6.34%  ±8.44% ±10.99%
async/async.js test='async' count=7660                -0.05 %       ±6.09%  ±8.10% ±10.55%
async/async.js test='async' count=7670                 0.77 %       ±7.06%  ±9.40% ±12.26%
async/async.js test='async' count=7680                -0.47 %       ±6.72%  ±8.94% ±11.65%
async/async.js test='async' count=7690                 2.24 %       ±5.90%  ±7.85% ±10.22%
async/async.js test='async' count=770          **    -10.10 %       ±6.07%  ±8.07% ±10.51%
async/async.js test='async' count=7700                 1.58 %       ±6.31%  ±8.40% ±10.93%
async/async.js test='async' count=7710                 1.29 %       ±6.05%  ±8.06% ±10.48%
async/async.js test='async' count=7720                 0.17 %       ±6.25%  ±8.31% ±10.82%
async/async.js test='async' count=7730                 0.07 %       ±5.83%  ±7.75% ±10.09%
async/async.js test='async' count=7740                 0.15 %       ±6.41%  ±8.54% ±11.11%
async/async.js test='async' count=7750                 1.91 %       ±6.99%  ±9.30% ±12.12%
async/async.js test='async' count=7760                 1.69 %       ±7.02%  ±9.34% ±12.15%
async/async.js test='async' count=7770                 1.03 %       ±6.12%  ±8.14% ±10.59%
async/async.js test='async' count=7780                 0.38 %       ±6.97%  ±9.28% ±12.09%
async/async.js test='async' count=7790                 0.85 %       ±6.13%  ±8.16% ±10.62%
async/async.js test='async' count=780           *     -7.98 %       ±6.02%  ±8.01% ±10.43%
async/async.js test='async' count=7800                 1.70 %       ±6.59%  ±8.77% ±11.41%
async/async.js test='async' count=7810                -0.33 %       ±6.35%  ±8.46% ±11.01%
async/async.js test='async' count=7820                 1.48 %       ±6.07%  ±8.08% ±10.51%
async/async.js test='async' count=7830                 1.91 %       ±6.69%  ±8.90% ±11.60%
async/async.js test='async' count=7840                 2.01 %       ±6.28%  ±8.35% ±10.87%
async/async.js test='async' count=7850                -0.76 %       ±5.97%  ±7.95% ±10.35%
async/async.js test='async' count=7860                 2.88 %       ±6.01%  ±7.99% ±10.41%
async/async.js test='async' count=7870                 3.26 %       ±6.57%  ±8.74% ±11.38%
async/async.js test='async' count=7880                 1.10 %       ±5.97%  ±7.94% ±10.34%
async/async.js test='async' count=7890                 4.24 %       ±5.75%  ±7.65%  ±9.95%
async/async.js test='async' count=790          **    -10.03 %       ±6.46%  ±8.60% ±11.19%
async/async.js test='async' count=7900                 4.20 %       ±6.80%  ±9.05% ±11.78%
async/async.js test='async' count=7910                 1.94 %       ±6.53%  ±8.69% ±11.32%
async/async.js test='async' count=7920                 1.80 %       ±7.21%  ±9.59% ±12.48%
async/async.js test='async' count=7930                 0.52 %       ±6.72%  ±8.94% ±11.64%
async/async.js test='async' count=7940                 3.14 %       ±7.26%  ±9.66% ±12.58%
async/async.js test='async' count=7950                 3.06 %       ±6.85%  ±9.12% ±11.87%
async/async.js test='async' count=7960                 0.62 %       ±6.73%  ±8.96% ±11.66%
async/async.js test='async' count=7970                 0.90 %       ±6.42%  ±8.54% ±11.12%
async/async.js test='async' count=7980                 4.35 %       ±6.56%  ±8.73% ±11.37%
async/async.js test='async' count=7990                 1.74 %       ±5.95%  ±7.92% ±10.30%
async/async.js test='async' count=80                   7.37 %       ±7.52% ±10.01% ±13.05%
async/async.js test='async' count=800           *     -6.51 %       ±6.35%  ±8.46% ±11.01%
async/async.js test='async' count=8000                 2.11 %       ±6.26%  ±8.33% ±10.84%
async/async.js test='async' count=8010                 3.07 %       ±6.48%  ±8.62% ±11.22%
async/async.js test='async' count=8020                 2.76 %       ±6.35%  ±8.45% ±11.00%
async/async.js test='async' count=8030                 1.76 %       ±6.07%  ±8.07% ±10.51%
async/async.js test='async' count=8040                 3.36 %       ±5.93%  ±7.89% ±10.27%
async/async.js test='async' count=8050                 2.57 %       ±6.25%  ±8.32% ±10.83%
async/async.js test='async' count=8060                 4.04 %       ±6.28%  ±8.36% ±10.88%
async/async.js test='async' count=8070                 1.36 %       ±6.37%  ±8.47% ±11.03%
async/async.js test='async' count=8080                 3.74 %       ±6.96%  ±9.26% ±12.05%
async/async.js test='async' count=8090                 2.20 %       ±7.03%  ±9.36% ±12.18%
async/async.js test='async' count=810         ***    -10.85 %       ±5.68%  ±7.56%  ±9.84%
async/async.js test='async' count=8100                 4.27 %       ±6.96%  ±9.28% ±12.12%
async/async.js test='async' count=8110                 3.35 %       ±7.16%  ±9.52% ±12.39%
async/async.js test='async' count=8120                 2.38 %       ±6.90%  ±9.19% ±11.96%
async/async.js test='async' count=8130                 3.64 %       ±7.57% ±10.08% ±13.12%
async/async.js test='async' count=8140                 3.30 %       ±7.18%  ±9.55% ±12.45%
async/async.js test='async' count=8150                 2.88 %       ±7.05%  ±9.39% ±12.22%
async/async.js test='async' count=8160                 2.32 %       ±6.85%  ±9.12% ±11.87%
async/async.js test='async' count=8170                 4.80 %       ±6.79%  ±9.03% ±11.75%
async/async.js test='async' count=8180                 3.36 %       ±6.84%  ±9.10% ±11.85%
async/async.js test='async' count=8190                 2.81 %       ±6.19%  ±8.24% ±10.73%
async/async.js test='async' count=820          **     -9.78 %       ±5.89%  ±7.83% ±10.20%
async/async.js test='async' count=8200                 2.50 %       ±7.13%  ±9.48% ±12.34%
async/async.js test='async' count=8210                 4.50 %       ±6.39%  ±8.50% ±11.06%
async/async.js test='async' count=8220                 4.15 %       ±6.91%  ±9.19% ±11.96%
async/async.js test='async' count=8230                 5.19 %       ±6.53%  ±8.69% ±11.31%
async/async.js test='async' count=8240                 4.57 %       ±6.64%  ±8.83% ±11.50%
async/async.js test='async' count=8250                 3.19 %       ±6.82%  ±9.07% ±11.81%
async/async.js test='async' count=830         ***    -12.38 %       ±7.00%  ±9.31% ±12.12%
async/async.js test='async' count=840           *     -7.42 %       ±6.63%  ±8.82% ±11.49%
async/async.js test='async' count=850           *     -7.61 %       ±7.55% ±10.06% ±13.10%
async/async.js test='async' count=860          **     -9.41 %       ±7.06%  ±9.40% ±12.24%
async/async.js test='async' count=870           *    -10.76 %       ±8.37% ±11.15% ±14.55%
async/async.js test='async' count=880          **    -10.31 %       ±7.14%  ±9.50% ±12.37%
async/async.js test='async' count=890          **     -9.37 %       ±6.03%  ±8.02% ±10.44%
async/async.js test='async' count=90                   6.54 %       ±8.17% ±10.89% ±14.21%
async/async.js test='async' count=900           *     -7.98 %       ±6.88%  ±9.16% ±11.92%
async/async.js test='async' count=910         ***    -10.42 %       ±5.92%  ±7.88% ±10.26%
async/async.js test='async' count=920         ***    -11.35 %       ±6.28%  ±8.36% ±10.88%
async/async.js test='async' count=930           *     -7.51 %       ±7.32%  ±9.74% ±12.68%
async/async.js test='async' count=940           *     -7.80 %       ±6.10%  ±8.11% ±10.57%
async/async.js test='async' count=950          **     -8.88 %       ±5.75%  ±7.65%  ±9.96%
async/async.js test='async' count=960           *     -9.49 %       ±7.34%  ±9.77% ±12.72%
async/async.js test='async' count=970                 -5.42 %       ±6.28%  ±8.36% ±10.89%
async/async.js test='async' count=980           *     -8.35 %       ±6.62%  ±8.81% ±11.48%
async/async.js test='async' count=990          **     -9.57 %       ±6.45%  ±8.59% ±11.19%

@mattwelke
Copy link

mattwelke commented Apr 23, 2021

I notice your test is using functions from console APIs. I believe the functions you call call console.log under the hood. If I recall, these are problematic because the console behaves differently on some systems. Best practice in production is to output directly to stdout instead of through console.log. Popular logging libraries do this. You should probably use the performance APIs to measure the times and then log the results at the end.

@aduh95
Copy link
Contributor

aduh95 commented Apr 23, 2021

@mattwelke Node.js benchmark suite is using process.hrtime, which is what I used to generate the graph above. It shows there is a performance regression not related to the console API.

@mattwelke
Copy link

Ah sorry I was on mobile and couldn't see all of that comment. Someone linked me here and asked me to take a look. I see there's actually a performance regression here.

@rileyweber
Copy link

Has there been any further discussion on this internally? I saw similar performance issues after deploying some production APIs on node 16 (previously node 14). Our APIs make heavy use of async/await, and immediately after the deployment was completed I saw an uptick in CPU and memory usage, along with increased response times - we ended up rolling back to 14. These APIs were running on AWS ECS (Fargate). We use the node:16-slim image (perhaps using the base node:16would help, not sure)

Unfortunately, I no longer have stats from that real-world scenario, but following suit with some of the benchmarks above i wrote a super basic test that just iterated through a loop and awaited an async function n number of times (e.g. 1 million, 5 million, etc).

const fn = () => Promise.resolve();

const n  = // 100000, 500000, 1000000, 5000000, etc...
for (let i = 0; i < n; i++) await fn();

Running the test on Node 16 was consistently slower than Node 14 after n reached about ~1M (also slower than Node 17).

  • node 10 -> 12: 12 is dramatically faster
  • node 12 -> 14: not a huge difference, if any at all
  • node 14 -> 16: 16 is much slower than 14 and 12, but still much better than 10
  • node 16 -> 17: 17 is slightly better than 16, but still worse than 14

I know that's a silly test to run, but it does show that something is going on. How it plays out in a real-world scenario likely depends on the workload, but like I said we heavily use async/await in our applications and definitely can't upgrade to node16+ in its current state :(

Btw, im on a 2018 MPB, core i9, 32gb memory, using nvm for node version switching.

@mattwelke
Copy link

@rileyweber Mind sharing a repo for the benchmark you ran? I've got a different setup and I can try to reproduce it so that they have more reproductions posted here.

@qiulang
Copy link
Author

qiulang commented Jan 24, 2022

@mattwelke I think you can just use https://fibjs.org/en/docs/guide/about.md.html to reproduce it (as when I first opened this issue)

@mattwelke
Copy link

I just noticed your benchmark was only the code you posted here. So I ran it with n = 5000000. Results:

node -v && time node index.js 
v10.24.1

real    0m0.418s
user    0m0.411s
sys     0m0.065s
node -v && time node index.js 
v12.22.9

real    0m0.211s
user    0m0.223s
sys     0m0.024s
node -v && time node index.js 
v14.18.3

real    0m0.223s
user    0m0.206s
sys     0m0.052s
node -v && time node index.js 
v16.13.2

real    0m0.255s
user    0m0.270s
sys     0m0.000s
node -v && time node index.js 
v17.4.0

real    0m0.237s
user    0m0.232s
sys     0m0.021s

My system:

AMD Ryzen 7 5800X 8-Core Processor
WSL 2 via Windows 10 Pro
OS:

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:        20.04
Codename:       focal

@mattwelke
Copy link

I'm not seeing much of a performance regression between 14 and 16 though once n gets a lot higher. In fact, eventually performance increases.

Here's n = 50M:

matt@DESKTOP-BVT2KNU:~/node-benchmark$ n 14
   installed : v14.18.3 (with npm 6.14.15)
matt@DESKTOP-BVT2KNU:~/node-benchmark$ node -v && time node index.js 
v14.18.3

real    0m2.038s
user    0m2.080s
sys     0m0.284s
matt@DESKTOP-BVT2KNU:~/node-benchmark$ n 16
   installed : v16.13.2 (with npm 8.1.2)
matt@DESKTOP-BVT2KNU:~/node-benchmark$ node -v && time node index.js 
v16.13.2

real    0m2.046s
user    0m2.063s
sys     0m0.073s

And n = 1B:

matt@DESKTOP-BVT2KNU:~/node-benchmark$ n 14
   installed : v14.18.3 (with npm 6.14.15)
matt@DESKTOP-BVT2KNU:~/node-benchmark$ node -v && time node index.js 
v14.18.3

real    0m37.034s
user    0m38.664s
sys     0m3.602s
matt@DESKTOP-BVT2KNU:~/node-benchmark$ n 16
   installed : v16.13.2 (with npm 8.1.2)
matt@DESKTOP-BVT2KNU:~/node-benchmark$ node -v && time node index.js 
v16.13.2

real    0m36.557s
user    0m36.837s
sys     0m0.344s

@rileyweber
Copy link

Yea overall I agree with the sentiment that benchmarks never show the full picture - the script I wrote was really just to get an idea. I also ran the benchmarks posted higher up in the thread and saw similar results where 16 consistently performed worse with async/await than 14 (and 12).

Mainly I don't want this conversation to fizzle out - I don't see anyone else talking about it on SO, etc., and I don't see related V8 posts - but these benchmarks and production workloads that I've seen show that something seems off.

@mattwelke
Copy link

Makes sense. I don't have any skin in this game because we're planning on phasing out our Node.js in production right now instead of upgrade it to 16+, so I'm out. But I do hope you get some eyes on it since you say it's affecting you.

I think general consensus is that small performance regressions aren't a big deal. They happen all the time, and we generally solve performance problems by just throwing more hardware at them. But for large regressions, that's a different story. Maybe if you shared stats on how badly performance worsened for you (you mentioned seeing large CPU usage increases), it would help the maintainers see the issue here.

@qiulang
Copy link
Author

qiulang commented Apr 24, 2022

I notice node 18 was released and V8 JavaScript engine was upgraded to 10.1 so I did the test again and found node18 has significantly improved the test result I did, almost reduce the 50% of running time of nodejs 14.

Actually although in my initial test node 16.0 was slower than node 14.15, I find node 16.14.2 has performed better than node 14.19.0.

So I closed this issue.

@qiulang qiulang closed this as completed Apr 24, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
performance Issues and PRs related to the performance of Node.js.
Projects
None yet
Development

No branches or pull requests

6 participants