diff options
author | Anna Henningsen <anna@addaleax.net> | 2019-08-25 03:07:09 +0200 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-09-02 21:02:34 -0700 |
commit | ab841d5fbab1a9d2f8323d1ae3f71f37c6f636a1 (patch) | |
tree | 2c43b17c57c7c2c9a92828f11ee6be4f0a457ab4 /benchmark | |
parent | 020c2eaf4bf630652c1e9d3b238579c37036a4aa (diff) | |
download | android-node-v8-ab841d5fbab1a9d2f8323d1ae3f71f37c6f636a1.tar.gz android-node-v8-ab841d5fbab1a9d2f8323d1ae3f71f37c6f636a1.tar.bz2 android-node-v8-ab841d5fbab1a9d2f8323d1ae3f71f37c6f636a1.zip |
lib: add ASCII fast path to getStringWidth()
A lot of strings that are going to be passed to `getStringWidth()`
are ASCII strings, for which the calculation is rather easy and
calling into C++ can be skipped.
confidence improvement accuracy (*) (**) (***)
misc/getstringwidth.js n=100000 type='ascii' *** 328.99 % ±21.73% ±29.25% ±38.77%
misc/getstringwidth.js n=100000 type='emojiseq' 2.94 % ±7.66% ±10.19% ±13.26%
misc/getstringwidth.js n=100000 type='fullwidth' 4.70 % ±5.64% ±7.50% ±9.76%
PR-URL: https://github.com/nodejs/node/pull/29301
Reviewed-By: Gus Caplan <me@gus.host>
Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Minwoo Jung <minwoo@nodesource.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/misc/getstringwidth.js | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/benchmark/misc/getstringwidth.js b/benchmark/misc/getstringwidth.js new file mode 100644 index 0000000000..12f071c60d --- /dev/null +++ b/benchmark/misc/getstringwidth.js @@ -0,0 +1,26 @@ +'use strict'; + +const common = require('../common.js'); + +const bench = common.createBenchmark(main, { + type: ['ascii', 'mixed', 'emojiseq', 'fullwidth'], + n: [10e4] +}, { + flags: ['--expose-internals'] +}); + +function main({ n, type }) { + const { getStringWidth } = require('internal/readline/utils'); + + const str = ({ + ascii: 'foobar'.repeat(100), + mixed: 'foo'.repeat(100) + '😀' + 'bar'.repeat(100), + emojiseq: '👨👨👧👦👨👩👦👦👨👩👧👧👩👩👧👦'.repeat(10), + fullwidth: '你好'.repeat(150) + })[type]; + + bench.start(); + for (let j = 0; j < n; j += 1) + getStringWidth(str); + bench.end(n); +} |