Last active
May 26, 2021 09:07
-
-
Save jcoglan/138d219eb380b51c52ca0b00da1b86a9 to your computer and use it in GitHub Desktop.
Revisions
-
jcoglan revised this gist
May 26, 2021 . 1 changed file with 24 additions and 24 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,36 +1,36 @@ # benchmark: `reduce()`, `filter()`, `map()`, transducers and `for` loops reduce() 10 x 574,156 ops/sec ±1.34% (86 runs sampled) reduce() 100 x 42,746 ops/sec ±1.99% (88 runs sampled) reduce() 1,000 x 781 ops/sec ±1.61% (88 runs sampled) filter() & map() 10 x 128,652 ops/sec ±1.21% (87 runs sampled) filter() & map() 100 x 9,537 ops/sec ±1.22% (90 runs sampled) filter() & map() 1,000 x 256 ops/sec ±1.07% (81 runs sampled) filter() & map() 10,000 x 67.54 ops/sec ±2.56% (68 runs sampled) filter() & map() 100,000 x 5.63 ops/sec ±16.64% (20 runs sampled) filter/map w/ pairs 10 x 115,949 ops/sec ±1.52% (87 runs sampled) filter/map w/ pairs 100 x 8,870 ops/sec ±1.86% (88 runs sampled) filter/map w/ pairs 1,000 x 277 ops/sec ±1.34% (81 runs sampled) filter/map w/ pairs 10,000 x 71.10 ops/sec ±1.37% (61 runs sampled) filter/map w/ pairs 100,000 x 6.68 ops/sec ±3.38% (20 runs sampled) fromEntries() 10 x 567,847 ops/sec ±1.71% (84 runs sampled) fromEntries() 100 x 70,766 ops/sec ±1.71% (85 runs sampled) fromEntries() 1,000 x 7,447 ops/sec ±0.93% (90 runs sampled) fromEntries() 10,000 x 548 ops/sec ±1.66% (85 runs sampled) fromEntries() 100,000 x 26.91 ops/sec ±13.13% (47 runs sampled) transducers 10 x 108,782 ops/sec ±1.93% (84 runs sampled) transducers 100 x 8,825 ops/sec ±1.41% (88 runs sampled) transducers 1,000 x 272 ops/sec ±2.02% (80 runs sampled) transducers 10,000 x 74.95 ops/sec ±0.99% (64 runs sampled) transducers 100,000 x 7.60 ops/sec ±6.52% (24 runs sampled) for-loop 10 x 1,880,249 ops/sec ±1.33% (89 runs sampled) for-loop 100 x 394,682 ops/sec ±1.32% (89 runs sampled) for-loop 1,000 x 45,280 ops/sec ±1.45% (86 runs sampled) for-loop 10,000 x 1,439 ops/sec ±0.92% (88 runs sampled) for-loop 100,000 x 97.50 ops/sec ±1.69% (71 runs sampled) for-loop 1,000,000 x 6.03 ops/sec ±4.85% (19 runs sampled) -
jcoglan revised this gist
May 25, 2021 . 3 changed files with 31 additions and 39 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,36 +1,36 @@ # benchmark: `reduce()`, `filter()`, `map()`, transducers and `for` loops reduce() 10 x 574,156 ops/sec ±1.34% (86 runs sampled) reduce() 100 x 42,746 ops/sec ±1.99% (88 runs sampled) reduce() 1,000 x 781 ops/sec ±1.61% (88 runs sampled) filter() & map() 10 x 128,652 ops/sec ±1.21% (87 runs sampled) filter() & map() 100 x 9,537 ops/sec ±1.22% (90 runs sampled) filter() & map() 1,000 x 256 ops/sec ±1.07% (81 runs sampled) filter() & map() 10,000 x 67.54 ops/sec ±2.56% (68 runs sampled) filter() & map() 100,000 x 5.63 ops/sec ±16.64% (20 runs sampled) filter/map w/ pairs 10 x 115,949 ops/sec ±1.52% (87 runs sampled) filter/map w/ pairs 100 x 8,870 ops/sec ±1.86% (88 runs sampled) filter/map w/ pairs 1,000 x 277 ops/sec ±1.34% (81 runs sampled) filter/map w/ pairs 10,000 x 71.10 ops/sec ±1.37% (61 runs sampled) filter/map w/ pairs 100,000 x 6.68 ops/sec ±3.38% (20 runs sampled) fromEntries() 10 x 567,847 ops/sec ±1.71% (84 runs sampled) fromEntries() 100 x 70,766 ops/sec ±1.71% (85 runs sampled) fromEntries() 1,000 x 7,447 ops/sec ±0.93% (90 runs sampled) fromEntries() 10,000 x 548 ops/sec ±1.66% (85 runs sampled) fromEntries() 100,000 x 26.91 ops/sec ±13.13% (47 runs sampled) transducers 10 x 108,782 ops/sec ±1.93% (84 runs sampled) transducers 100 x 8,825 ops/sec ±1.41% (88 runs sampled) transducers 1,000 x 272 ops/sec ±2.02% (80 runs sampled) transducers 10,000 x 74.95 ops/sec ±0.99% (64 runs sampled) transducers 100,000 x 7.60 ops/sec ±6.52% (24 runs sampled) for-loop 10 x 1,880,249 ops/sec ±1.33% (89 runs sampled) for-loop 100 x 394,682 ops/sec ±1.32% (89 runs sampled) for-loop 1,000 x 45,280 ops/sec ±1.45% (86 runs sampled) for-loop 10,000 x 1,439 ops/sec ±0.92% (88 runs sampled) for-loop 100,000 x 97.50 ops/sec ±1.69% (71 runs sampled) for-loop 1,000,000 x 6.03 ops/sec ±4.85% (19 runs sampled) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,13 +1,5 @@ const { Suite } = require('benchmark') const { useReduce, useFilterMap, useFilterMap2, useFromEntries, useTransduce, useLoop } = require('./impls') function genUsers(n) { This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -18,7 +18,7 @@ function useFilterMap2(users) { return users .filter(user => !user.active) .map(user => [user.id, user.name]) .reduce((a, [id, name]) => Object.assign(a, { [id]: name }), {}) } function useFromEntries(users) { -
jcoglan revised this gist
May 25, 2021 . 3 changed files with 53 additions and 25 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,30 +1,36 @@ # benchmark: `reduce()`, `filter()`, `map()`, transducers and `for` loops reduce() 10 x 623,457 ops/sec ±1.03% (90 runs sampled) reduce() 100 x 27,499 ops/sec ±23.10% (60 runs sampled) reduce() 1,000 x 406 ops/sec ±9.05% (52 runs sampled) filter() & map() 10 x 66,682 ops/sec ±16.47% (47 runs sampled) filter() & map() 100 x 6,062 ops/sec ±7.57% (61 runs sampled) filter() & map() 1,000 x 203 ops/sec ±8.60% (67 runs sampled) filter() & map() 10,000 x 51.11 ops/sec ±5.96% (52 runs sampled) filter() & map() 100,000 x 4.43 ops/sec ±12.38% (15 runs sampled) filter/map w/ pairs 10 x 648,770 ops/sec ±11.44% (60 runs sampled) filter/map w/ pairs 100 x 79,397 ops/sec ±22.03% (65 runs sampled) filter/map w/ pairs 1,000 x 10,291 ops/sec ±15.46% (69 runs sampled) filter/map w/ pairs 10,000 x 1,151 ops/sec ±8.71% (79 runs sampled) filter/map w/ pairs 100,000 x 16.34 ops/sec ±27.39% (25 runs sampled) fromEntries() 10 x 295,490 ops/sec ±18.30% (55 runs sampled) fromEntries() 100 x 50,596 ops/sec ±10.87% (72 runs sampled) fromEntries() 1,000 x 3,251 ops/sec ±18.47% (48 runs sampled) fromEntries() 10,000 x 411 ops/sec ±7.32% (74 runs sampled) fromEntries() 100,000 x 16.89 ops/sec ±29.16% (31 runs sampled) transducers 10 x 89,921 ops/sec ±10.11% (79 runs sampled) transducers 100 x 6,238 ops/sec ±10.04% (68 runs sampled) transducers 1,000 x 210 ops/sec ±11.61% (67 runs sampled) transducers 10,000 x 44.52 ops/sec ±13.79% (46 runs sampled) transducers 100,000 x 6.83 ops/sec ±4.64% (21 runs sampled) for-loop 10 x 1,115,518 ops/sec ±10.40% (63 runs sampled) for-loop 100 x 279,693 ops/sec ±10.19% (68 runs sampled) for-loop 1,000 x 30,049 ops/sec ±7.23% (73 runs sampled) for-loop 10,000 x 1,028 ops/sec ±6.20% (74 runs sampled) for-loop 100,000 x 85.71 ops/sec ±7.90% (64 runs sampled) for-loop 1,000,000 x 5.90 ops/sec ±4.41% (19 runs sampled) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,5 +1,13 @@ const { Suite } = require('benchmark') const { useReduce, useFilterMap, useFilterMap2, useFromEntries, useTransduce, useLoop } = require('./impls') function genUsers(n) { @@ -27,6 +35,12 @@ suite.add('filter() & map() 1,000', () => useFilterMap(users[1000])) suite.add('filter() & map() 10,000', () => useFilterMap(users[10000])) suite.add('filter() & map() 100,000', () => useFilterMap(users[100000])) suite.add('filter/map w/ pairs 10', () => useFilterMap2(users[10])) suite.add('filter/map w/ pairs 100', () => useFilterMap2(users[100])) suite.add('filter/map w/ pairs 1,000', () => useFilterMap2(users[1000])) suite.add('filter/map w/ pairs 10,000', () => useFilterMap2(users[10000])) suite.add('filter/map w/ pairs 100,000', () => useFilterMap2(users[100000])) suite.add('fromEntries() 10', () => useFromEntries(users[10])) suite.add('fromEntries() 100', () => useFromEntries(users[100])) suite.add('fromEntries() 1,000', () => useFromEntries(users[1000])) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -14,6 +14,13 @@ function useFilterMap(users) { .reduce((a, b) => Object.assign(a, b), {}) } function useFilterMap2(users) { return users .filter(user => !user.active) .map(user => [user.id, user.name]) .reduce((a, b) => Object.assign(a, { [b.id]: b.name }), {}) } function useFromEntries(users) { return Object.fromEntries( users @@ -57,6 +64,7 @@ function useLoop(users) { module.exports = { useReduce, useFilterMap, useFilterMap2, useFromEntries, useTransduce, useLoop, -
jcoglan revised this gist
May 25, 2021 . 3 changed files with 48 additions and 27 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,24 +1,30 @@ # benchmark: `reduce()`, `filter()`, `map()`, transducers and `for` loops reduce() 10 x 486,918 ops/sec ±1.30% (89 runs sampled) reduce() 100 x 36,457 ops/sec ±4.33% (81 runs sampled) reduce() 1,000 x 783 ops/sec ±1.11% (90 runs sampled) filter() & map() 10 x 116,811 ops/sec ±1.45% (88 runs sampled) filter() & map() 100 x 9,162 ops/sec ±0.90% (90 runs sampled) filter() & map() 1,000 x 235 ops/sec ±3.27% (78 runs sampled) filter() & map() 10,000 x 66.93 ops/sec ±1.61% (68 runs sampled) filter() & map() 100,000 x 5.45 ops/sec ±16.41% (19 runs sampled) fromEntries() 10 x 563,396 ops/sec ±1.44% (87 runs sampled) fromEntries() 100 x 68,920 ops/sec ±2.35% (85 runs sampled) fromEntries() 1,000 x 7,368 ops/sec ±0.81% (90 runs sampled) fromEntries() 10,000 x 531 ops/sec ±2.22% (83 runs sampled) fromEntries() 100,000 x 25.87 ops/sec ±8.24% (45 runs sampled) transducers 10 x 112,853 ops/sec ±1.75% (88 runs sampled) transducers 100 x 9,060 ops/sec ±0.79% (88 runs sampled) transducers 1,000 x 274 ops/sec ±2.89% (80 runs sampled) transducers 10,000 x 73.55 ops/sec ±7.00% (63 runs sampled) transducers 100,000 x 7.94 ops/sec ±10.66% (25 runs sampled) for-loop 10 x 1,931,510 ops/sec ±1.36% (90 runs sampled) for-loop 100 x 400,292 ops/sec ±1.02% (87 runs sampled) for-loop 1,000 x 38,818 ops/sec ±10.86% (75 runs sampled) for-loop 10,000 x 1,429 ops/sec ±1.07% (87 runs sampled) for-loop 100,000 x 94.78 ops/sec ±3.08% (69 runs sampled) for-loop 1,000,000 x 5.93 ops/sec ±4.55% (19 runs sampled) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,5 +1,5 @@ const { Suite } = require('benchmark') const { useReduce, useFilterMap, useFromEntries, useTransduce, useLoop } = require('./impls') function genUsers(n) { @@ -27,6 +27,12 @@ suite.add('filter() & map() 1,000', () => useFilterMap(users[1000])) suite.add('filter() & map() 10,000', () => useFilterMap(users[10000])) suite.add('filter() & map() 100,000', () => useFilterMap(users[100000])) suite.add('fromEntries() 10', () => useFromEntries(users[10])) suite.add('fromEntries() 100', () => useFromEntries(users[100])) suite.add('fromEntries() 1,000', () => useFromEntries(users[1000])) suite.add('fromEntries() 10,000', () => useFromEntries(users[10000])) suite.add('fromEntries() 100,000', () => useFromEntries(users[100000])) suite.add('transducers 10', () => useTransduce(users[10])) suite.add('transducers 100', () => useTransduce(users[100])) suite.add('transducers 1,000', () => useTransduce(users[1000])) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -14,12 +14,12 @@ function useFilterMap(users) { .reduce((a, b) => Object.assign(a, b), {}) } function useFromEntries(users) { return Object.fromEntries( users .filter(user => !user.active) .map(user => [user.id, user.name]) ) } function useTransduce(users) { @@ -45,10 +45,19 @@ const concat = (a, b) => a.concat([b]) const assign = (a, b) => Object.assign(a, b) function useLoop(users) { let results = {} for (let user of users) { if (!user.active) results[user.id] = user.name } return results } module.exports = { useReduce, useFilterMap, useFromEntries, useTransduce, useLoop, } -
jcoglan created this gist
May 25, 2021 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,24 @@ # benchmark: `reduce()`, `filter()`, `map()`, transducers and `for` loops reduce() 10 x 570,518 ops/sec ±1.42% (87 runs sampled) reduce() 100 x 42,118 ops/sec ±1.71% (86 runs sampled) reduce() 1,000 x 780 ops/sec ±1.61% (85 runs sampled) filter() & map() 10 x 122,266 ops/sec ±2.27% (88 runs sampled) filter() & map() 100 x 9,181 ops/sec ±1.81% (86 runs sampled) filter() & map() 1,000 x 253 ops/sec ±0.95% (84 runs sampled) filter() & map() 10,000 x 66.78 ops/sec ±2.49% (68 runs sampled) filter() & map() 100,000 x 5.66 ops/sec ±17.72% (19 runs sampled) transducers 10 x 115,744 ops/sec ±1.78% (83 runs sampled) transducers 100 x 9,158 ops/sec ±0.92% (90 runs sampled) transducers 1,000 x 279 ops/sec ±1.43% (82 runs sampled) transducers 10,000 x 74.54 ops/sec ±1.51% (64 runs sampled) transducers 100,000 x 7.85 ops/sec ±6.95% (23 runs sampled) for-loop 10 x 1,809,401 ops/sec ±1.82% (86 runs sampled) for-loop 100 x 392,151 ops/sec ±1.14% (86 runs sampled) for-loop 1,000 x 42,751 ops/sec ±1.75% (83 runs sampled) for-loop 10,000 x 1,362 ops/sec ±3.06% (86 runs sampled) for-loop 100,000 x 92.82 ops/sec ±2.37% (68 runs sampled) for-loop 1,000,000 x 5.62 ops/sec ±4.49% (18 runs sampled) This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,47 @@ const { Suite } = require('benchmark') const { useReduce, useFilterMap, useLoop, useTransduce } = require('./impls') function genUsers(n) { let users = [] while (n--) users.push({ active: false, id: n, name: `user ${n}` }) return users } let users = {} for (let n of [10, 100, 1000, 10000, 100000, 1000000]) users[n] = genUsers(n) let suite = new Suite() suite.add('reduce() 10', () => useReduce(users[10])) suite.add('reduce() 100', () => useReduce(users[100])) suite.add('reduce() 1,000', () => useReduce(users[1000])) // suite.add('reduce() 10,000', () => useReduce(users[10000])) // suite.add('reduce() 100,000', () => useReduce(users[100000])) suite.add('filter() & map() 10', () => useFilterMap(users[10])) suite.add('filter() & map() 100', () => useFilterMap(users[100])) suite.add('filter() & map() 1,000', () => useFilterMap(users[1000])) suite.add('filter() & map() 10,000', () => useFilterMap(users[10000])) suite.add('filter() & map() 100,000', () => useFilterMap(users[100000])) suite.add('transducers 10', () => useTransduce(users[10])) suite.add('transducers 100', () => useTransduce(users[100])) suite.add('transducers 1,000', () => useTransduce(users[1000])) suite.add('transducers 10,000', () => useTransduce(users[10000])) suite.add('transducers 100,000', () => useTransduce(users[100000])) suite.add('for-loop 10', () => useLoop(users[10])) suite.add('for-loop 100', () => useLoop(users[100])) suite.add('for-loop 1,000', () => useLoop(users[1000])) suite.add('for-loop 10,000', () => useLoop(users[10000])) suite.add('for-loop 100,000', () => useLoop(users[100000])) suite.add('for-loop 1,000,000', () => useLoop(users[1000000])) suite.on('complete', () => { suite.forEach((test) => console.log(test.toString())) }) suite.run() This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,54 @@ function useReduce(users) { return users.reduce((acc, curr) => { if (curr.active) return acc else return { ...acc, [curr.id]: curr.name } }, {}) } function useFilterMap(users) { return users .filter(user => !user.active) .map(user => ({ [user.id]: user.name })) .reduce((a, b) => Object.assign(a, b), {}) } function useLoop(users) { let results = {} for (let user of users) { if (!user.active) results[user.id] = user.name } return results } function useTransduce(users) { return users.reduce( compose([ filter(user => !user.active), map(user => ({ [user.id]: user.name })) ])(assign), {} ) } const map = (f) => (step) => (a, c) => step(a, f(c)) const filter = (pred) => (step) => (a, c) => pred(c) ? step(a, c) : a const compose = (fns) => (x) => fns.reduceRight((y, f) => f(y), x) const concat = (a, b) => a.concat([b]) const assign = (a, b) => Object.assign(a, b) module.exports = { useReduce, useFilterMap, useLoop, useTransduce }