diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-12-19 15:08:18 +0100 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-12-27 19:48:07 +0100 |
commit | 83e5215a4e8438a43b9f0002b7a43e2fd2dd37a4 (patch) | |
tree | 3a0be3dda02df06814d9ec9b73a22c1afa4b0ddc /test/parallel/test-async-hooks-recursive-stack.js | |
parent | df30fd586d123fc189887fc0f9c7f27808374c2e (diff) | |
download | android-node-v8-83e5215a4e8438a43b9f0002b7a43e2fd2dd37a4.tar.gz android-node-v8-83e5215a4e8438a43b9f0002b7a43e2fd2dd37a4.tar.bz2 android-node-v8-83e5215a4e8438a43b9f0002b7a43e2fd2dd37a4.zip |
async_hooks: use typed array stack as fast path
- Communicate the current async stack length through a
typed array field rather than a native binding method
- Add a new fixed-size `async_ids_fast_stack` typed array
that contains the async ID stack up to a fixed limit.
This increases performance noticeably, since most of the time
the async ID stack will not be more than a handful of
levels deep.
- Make the JS `pushAsyncIds()` and `popAsyncIds()` functions
do the same thing as the native ones if the fast path
is applicable.
Benchmarks:
$ ./node benchmark/compare.js --new ./node --old ./node-master --runs 10 --filter next-tick process | Rscript benchmark/compare.R
[00:03:25|% 100| 6/6 files | 20/20 runs | 1/1 configs]: Done
improvement confidence p.value
process/next-tick-breadth-args.js millions=4 19.72 % *** 3.013913e-06
process/next-tick-breadth.js millions=4 27.33 % *** 5.847983e-11
process/next-tick-depth-args.js millions=12 40.08 % *** 1.237127e-13
process/next-tick-depth.js millions=12 77.27 % *** 1.413290e-11
process/next-tick-exec-args.js millions=5 13.58 % *** 1.245180e-07
process/next-tick-exec.js millions=5 16.80 % *** 2.961386e-07
PR-URL: https://github.com/nodejs/node/pull/17780
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'test/parallel/test-async-hooks-recursive-stack.js')
-rw-r--r-- | test/parallel/test-async-hooks-recursive-stack.js | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/test/parallel/test-async-hooks-recursive-stack.js b/test/parallel/test-async-hooks-recursive-stack.js new file mode 100644 index 0000000000..7ab73dc1bf --- /dev/null +++ b/test/parallel/test-async-hooks-recursive-stack.js @@ -0,0 +1,20 @@ +'use strict'; +require('../common'); +const assert = require('assert'); +const async_hooks = require('async_hooks'); + +// This test verifies that the async ID stack can grow indefinitely. + +function recurse(n) { + const a = new async_hooks.AsyncResource('foobar'); + a.emitBefore(); + assert.strictEqual(a.asyncId(), async_hooks.executionAsyncId()); + assert.strictEqual(a.triggerAsyncId(), async_hooks.triggerAsyncId()); + if (n >= 0) + recurse(n - 1); + assert.strictEqual(a.asyncId(), async_hooks.executionAsyncId()); + assert.strictEqual(a.triggerAsyncId(), async_hooks.triggerAsyncId()); + a.emitAfter(); +} + +recurse(1000); |