This commit is contained in:
Dawid Dziurla 2020-03-26 15:37:35 +01:00
parent d9becc67b6
commit 9308795b8b
No known key found for this signature in database
GPG key ID: 7B6D8368172E9B0B
964 changed files with 104265 additions and 16 deletions

21
node_modules/flatstr/LICENSE generated vendored Normal file
View file

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2016 David Mark Clements
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

234
node_modules/flatstr/alt-benchmark.js generated vendored Normal file
View file

@ -0,0 +1,234 @@
'use strict'
var nul = process.platform === 'win32' ? '\\\\.\\NUL' : '/dev/null'
var bench = require('fastbench')
var stream = require('fs').createWriteStream(nul)
var alt0 = require('./')
var largeStr = JSON.stringify(require('./package.json'))
largeStr += largeStr
largeStr += largeStr
var run = bench([
function alt0ManySmallConcats (cb) {
stream.write(alt0(makeStr('a', 200)))
setImmediate(cb)
},
function alt1ManySmallConcats (cb) {
stream.write(alt1(makeStr('a', 200)))
setImmediate(cb)
},
function alt2ManySmallConcats (cb) {
stream.write(alt2(makeStr('a', 200)))
setImmediate(cb)
},
function alt3ManySmallConcats (cb) {
stream.write(alt3(makeStr('a', 200)))
setImmediate(cb)
},
function alt4ManySmallConcats (cb) {
stream.write(alt4(makeStr('a', 200)))
setImmediate(cb)
},
function alt5ManySmallConcats (cb) {
stream.write(alt5(makeStr('a', 200)))
setImmediate(cb)
},
function alt6ManySmallConcats (cb) {
stream.write(alt6(makeStr('a', 200)))
setImmediate(cb)
},
function alt7ManySmallConcats (cb) {
stream.write(alt7(makeStr('a', 200)))
setImmediate(cb)
},
function alt8ManySmallConcats (cb) {
stream.write(alt8(makeStr('a', 200)))
setImmediate(cb)
},
function alt9ManySmallConcats (cb) {
stream.write(alt9(makeStr('a', 200)))
setImmediate(cb)
},
function alt0SeveralLargeConcats (cb) {
stream.write(alt0(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt1SeveralLargeConcats (cb) {
stream.write(alt1(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt2SeveralLargeConcats (cb) {
stream.write(alt2(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt3SeveralLargeConcats (cb) {
stream.write(alt3(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt4SeveralLargeConcats (cb) {
stream.write(alt4(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt5SeveralLargeConcats (cb) {
stream.write(alt5(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt6SeveralLargeConcats (cb) {
stream.write(alt6(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt7SeveralLargeConcats (cb) {
stream.write(alt7(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt8SeveralLargeConcats (cb) {
stream.write(alt8(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt9SeveralLargeConcats (cb) {
stream.write(alt9(makeStr(largeStr, 10)))
setImmediate(cb)
},
function alt0ExponentialSmallConcats (cb) {
stream.write(alt0(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt1ExponentialSmallConcats (cb) {
stream.write(alt1(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt2ExponentialSmallConcats (cb) {
stream.write(alt2(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt3ExponentialSmallConcats (cb) {
stream.write(alt3(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt4ExponentialSmallConcats (cb) {
stream.write(alt4(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt5ExponentialSmallConcats (cb) {
stream.write(alt5(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt6ExponentialSmallConcats (cb) {
stream.write(alt6(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt7ExponentialSmallConcats (cb) {
stream.write(alt7(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt8ExponentialSmallConcats (cb) {
stream.write(alt8(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt9ExponentialSmallConcats (cb) {
stream.write(alt9(makeExpoStr('a', 12)))
setImmediate(cb)
},
function alt0ExponentialLargeConcats (cb) {
stream.write(alt0(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt1ExponentialLargeConcats (cb) {
stream.write(alt1(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt2ExponentialLargeConcats (cb) {
stream.write(alt2(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt3ExponentialLargeConcats (cb) {
stream.write(alt3(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt4ExponentialLargeConcats (cb) {
stream.write(alt4(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt5ExponentialLargeConcats (cb) {
stream.write(alt5(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt6ExponentialLargeConcats (cb) {
stream.write(alt6(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt7ExponentialLargeConcats (cb) {
stream.write(alt7(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt8ExponentialLargeConcats (cb) {
stream.write(alt8(makeExpoStr(largeStr, 7)))
setImmediate(cb)
},
function alt9ExponentialLargeConcats (cb) {
stream.write(alt9(makeExpoStr(largeStr, 7)))
setImmediate(cb)
}
], 10000)
run(run)
var rx = /()/
function alt1 (s) {
rx.test(s)
return s
}
function alt2 (s) {
rx.exec(s)
return s
}
function alt3 (s) {
s | 0
return s
}
function alt4 (s) {
~s
return s
}
function alt5 (s) {
escape(s)
return s
}
function alt6 (s) {
unescape(s)
return s
}
function alt7 (s) {
parseInt(s, 10)
return s
}
function alt8 (s) {
parseFloat(s)
return s
}
function alt9 (s) {
alt9[s] = null
return s
}
function makeStr (str, concats) {
var s = ''
while (concats--) {
s += str
}
return s
}
function makeExpoStr (str, concats) {
var s = str
while (concats--) {
s += s
}
return s
}

61
node_modules/flatstr/benchmark.js generated vendored Normal file
View file

@ -0,0 +1,61 @@
'use strict'
var nul = process.platform === 'win32' ? '\\\\.\\NUL' : '/dev/null'
var bench = require('fastbench')
var stream = require('fs').createWriteStream(nul)
var flatstr = require('./')
var largeStr = JSON.stringify(require('./package.json'))
largeStr += largeStr
largeStr += largeStr
var run = bench([
function unflattenedManySmallConcats (cb) {
stream.write(makeStr('a', 200))
setImmediate(cb)
},
function flattenedManySmallConcats (cb) {
stream.write(flatstr(makeStr('a', 200)))
setImmediate(cb)
},
function unflattenedSeveralLargeConcats (cb) {
stream.write(makeStr(largeStr, 10))
setImmediate(cb)
},
function flattenedSeveralLargeConcats (cb) {
stream.write(flatstr(makeStr(largeStr, 10)))
setImmediate(cb)
},
function unflattenedExponentialSmallConcats (cb) {
stream.write(makeExpoStr('a', 12))
setImmediate(cb)
},
function flattenedExponentialSmallConcats (cb) {
stream.write(flatstr(makeExpoStr('a', 12)))
setImmediate(cb)
},
function unflattenedExponentialLargeConcats (cb) {
stream.write(makeExpoStr(largeStr, 7))
setImmediate(cb)
},
function flattenedExponentialLargeConcats (cb) {
stream.write(flatstr(makeExpoStr(largeStr, 7)))
setImmediate(cb)
}
], 10000)
run(run)
function makeStr (str, concats) {
var s = ''
while (concats--) {
s += str
}
return s
}
function makeExpoStr (str, concats) {
var s = str
while (concats--) {
s += s
}
return s
}

15
node_modules/flatstr/index.js generated vendored Normal file
View file

@ -0,0 +1,15 @@
'use strict'
// You may be tempted to copy and paste this,
// but take a look at the commit history first,
// this is a moving target so relying on the module
// is the best way to make sure the optimization
// method is kept up to date and compatible with
// every Node version.
function flatstr (s) {
s | 0
return s
}
module.exports = flatstr

58
node_modules/flatstr/package.json generated vendored Normal file
View file

@ -0,0 +1,58 @@
{
"_from": "flatstr@^1.0.12",
"_id": "flatstr@1.0.12",
"_inBundle": false,
"_integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==",
"_location": "/flatstr",
"_phantomChildren": {},
"_requested": {
"type": "range",
"registry": true,
"raw": "flatstr@^1.0.12",
"name": "flatstr",
"escapedName": "flatstr",
"rawSpec": "^1.0.12",
"saveSpec": null,
"fetchSpec": "^1.0.12"
},
"_requiredBy": [
"/pino",
"/sonic-boom"
],
"_resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
"_shasum": "c2ba6a08173edbb6c9640e3055b95e287ceb5931",
"_spec": "flatstr@^1.0.12",
"_where": "/home/dawidd6/github/dawidd6/action-debian-package/node_modules/pino",
"author": {
"name": "David Mark Clements"
},
"browser": {
"v8": "./v8"
},
"bugs": {
"url": "https://github.com/davidmarkclements/flatstr/issues"
},
"bundleDependencies": false,
"dependencies": {},
"deprecated": false,
"description": "Flattens the underlying C structures of a concatenated JavaScript string",
"devDependencies": {
"fastbench": "^1.0.1",
"tap": "^12.0.1"
},
"homepage": "https://github.com/davidmarkclements/flatstr#readme",
"license": "MIT",
"main": "index.js",
"name": "flatstr",
"repository": {
"type": "git",
"url": "git+https://github.com/davidmarkclements/flatstr.git"
},
"tags": [
"perf",
"performance",
"strings",
"concatenation"
],
"version": "1.0.12"
}

82
node_modules/flatstr/readme.md generated vendored Normal file
View file

@ -0,0 +1,82 @@
# flatstr
Flattens the underlying C structures of a concatenated JavaScript string
## About
If you're doing lots of string concatenation and then writing that
string somewhere, you may find that passing your string through
`flatstr` vastly improves performance.
## Usage
```js
var flatstr = require('flatstr')
flatstr(someHeavilyConcatenatedString)
```
## Benchmarks
Benchmarks test flat vs non-flat strings being written to
an `fs.WriteStream`.
```
unflattenedManySmallConcats*10000: 147.540ms
flattenedManySmallConcats*10000: 105.994ms
unflattenedSeveralLargeConcats*10000: 287.901ms
flattenedSeveralLargeConcats*10000: 226.121ms
unflattenedExponentialSmallConcats*10000: 410.533ms
flattenedExponentialSmallConcats*10000: 219.973ms
unflattenedExponentialLargeConcats*10000: 2774.230ms
flattenedExponentialLargeConcats*10000: 1862.815ms
```
In each case, flattened strings win,
here's the performance gains from using `flatstr`
```
ManySmallConcats: 28%
SeveralLargeConcats: 21%
ExponentialSmallConcats: 46%
ExponentialLargeConcats: 33%
```
## How does it work
In the v8 C++ layer, JavaScript strings can be represented in two ways.
1. As an array
2. As a tree
When JavaScript strings are concatenated, tree structures are used
to represent them. For the concat operation, this is cheaper than
reallocating a larger array. However, performing other operations
on the tree structures can become costly (particularly where lots of
concatenation has occurred).
V8 has a a method called `String::Flatten`which converts the tree into a C array. This method is typically called before operations that walk through the bytes of the string (for instance, when testing against a regular expression). It may also be called if a string is accessed many times over,
as an optimization on the string. However, strings aren't always flattened. One example is when we pass a string into a `WriteStream`, at some point the string will be converted to a buffer, and this may be expensive if the underlying representation is a tree.
`String::Flatten` is not exposed as a JavaScript function, but it can be triggered as a side effect.
There are several ways to indirectly call `String::Flatten` (see `alt-benchmark.js`),
but coercion to a number appears to be (one of) the cheapest.
However since Node 10 the V8 version has stopped using Flatten in all
places identified. Thus the code has been updated to seamlessly
use the native runtime function `%FlattenString` without having to use
the `--allow-natives-syntax` flag directly.
One final note: calling flatstr too much can in fact negatively effect performance. For instance, don't call it every time you concat (if that
was performant, v8 wouldn't be using trees in the first place). The best
place to use flatstr is just prior to passing it to an API that eventually
runs non-v8 code (such as `fs.WriteStream`, or perhaps `xhr` or DOM apis in the browser).
## Acknowledgements
* Sponsored by nearForm
## License
MIT

26
node_modules/flatstr/test.js generated vendored Normal file
View file

@ -0,0 +1,26 @@
'use strict'
var test = require('tap').test
var flatstr = require('.')
test('does not throw', function (t) {
t.doesNotThrow(() => {
flatstr('abc')
})
t.doesNotThrow(() => {
flatstr({})
})
t.doesNotThrow(() => {
flatstr(1)
})
t.doesNotThrow(() => {
flatstr(null)
})
t.end()
})
test('returns the same value that was passed in', function (t) {
var o = {}
t.is(flatstr('abc'), 'abc')
t.is(flatstr(o), o)
t.end()
})