Skip to content

Commit 55002dd

Browse files
committed
increase performance & add benchmark cases
1 parent ccd037f commit 55002dd

File tree

3 files changed

+27
-13
lines changed

3 files changed

+27
-13
lines changed

README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ insert('123', 'yo', 2)
3636
node benchmark.js
3737
```
3838
### Results
39-
```javascript
40-
insert(string, 'foo', 3)
41-
// → 11,097,858 ops/sec ±0.70% (84 runs sampled)
42-
insert(array, 'foo', 3)
43-
// → 1,015,198 ops/sec ±0.97% (86 runs sampled)
44-
insert(array, ['foo', undefined, true], 3)
45-
// → 1,839,994 ops/sec ±0.87% (83 runs sampled)
39+
```shell
40+
insert string into string x 10,419,264 ops/sec ±0.77% (84 runs sampled)
41+
insert 1x array into string x 2,414,477 ops/sec ±0.94% (85 runs sampled)
42+
insert string into 10x array x 1,672,396 ops/sec ±1.11% (83 runs sampled)
43+
insert number into 10x array x 1,611,555 ops/sec ±1.49% (80 runs sampled)
44+
insert object into 10x array x 1,604,038 ops/sec ±2.43% (80 runs sampled)
45+
insert 3x array into 10x array x 1,636,813 ops/sec ±1.30% (78 runs sampled)
4646
```
4747

4848
## License

benchmark.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,25 @@ var Suite = new Benchmark.Suite
33
var insert = require('./index.js')
44

55
var testString = 'abcdefg'
6-
var testArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
6+
var testArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
77

88
Suite
9-
.add('string insert', function () {
9+
.add('insert string into string', function () {
1010
insert(testString, 'foo', 3)
1111
})
12-
.add('array insert string', function () {
12+
.add('insert 1x array into string', function () {
13+
insert(testString, ['foo', undefined, true], 3)
14+
})
15+
.add('insert string into 10x array', function () {
1316
insert(testArray, 'foo', 3)
1417
})
15-
.add('array insert array', function () {
18+
.add('insert number into 10x array', function () {
19+
insert(testArray, 5, 3)
20+
})
21+
.add('insert object into 10x array', function () {
22+
insert(testArray, { foo: 'bar' }, 3)
23+
})
24+
.add('insert 3x array into 10x array', function () {
1625
insert(testArray, ['foo', undefined, true], 3)
1726
})
1827
.on('cycle', function (e) {

index.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66
* @returns {Array|String} New modified value depending on `input` type.
77
*/
88
module.exports = function (input, value, index) {
9-
if (typeof input !== 'string' && !Array.isArray(input))
9+
var isStringInput = typeof input === 'string'
10+
if (!isStringInput && !Array.isArray(input))
1011
throw new TypeError('First argument invalid. Expected Array or String.')
1112
if (typeof index !== 'undefined' && typeof index !== 'number')
1213
throw new TypeError('Third argument invalid. Expected Number.')
13-
return input.slice(0, index || 0).concat(value).concat(input.slice(index || 0))
14+
// Avoid negative index offset
15+
var beacon = index || 0
16+
// concat([value]) is faster than concat(value) for String, Number and Object
17+
var insert = (Array.isArray(value) || isStringInput)? value: [value]
18+
return input.slice(0, beacon).concat(insert).concat(input.slice(beacon))
1419
}

0 commit comments

Comments
 (0)