Skip to content

Instantly share code, notes, and snippets.

@jcoglan
Last active May 26, 2021 09:07
Show Gist options
  • Select an option

  • Save jcoglan/138d219eb380b51c52ca0b00da1b86a9 to your computer and use it in GitHub Desktop.

Select an option

Save jcoglan/138d219eb380b51c52ca0b00da1b86a9 to your computer and use it in GitHub Desktop.

Revisions

  1. jcoglan revised this gist May 26, 2021. 1 changed file with 24 additions and 24 deletions.
    48 changes: 24 additions & 24 deletions README.md
    Original 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)
    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() 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)
    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)
    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)
    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)
  2. jcoglan revised this gist May 25, 2021. 3 changed files with 31 additions and 39 deletions.
    58 changes: 29 additions & 29 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -1,36 +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)
    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 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() 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 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)
    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 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)
    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 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)
    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,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)
    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)
    10 changes: 1 addition & 9 deletions bench.js
    Original 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')
    const { useReduce, useFilterMap, useFilterMap2, useFromEntries, useTransduce, useLoop } = require('./impls')


    function genUsers(n) {
    2 changes: 1 addition & 1 deletion impls.js
    Original 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, b) => Object.assign(a, { [b.id]: b.name }), {})
    .reduce((a, [id, name]) => Object.assign(a, { [id]: name }), {})
    }

    function useFromEntries(users) {
  3. jcoglan revised this gist May 25, 2021. 3 changed files with 53 additions and 25 deletions.
    54 changes: 30 additions & 24 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -1,30 +1,36 @@
    # 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)
    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 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)
    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)

    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)
    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)

    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)
    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)

    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)
    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)
    16 changes: 15 additions & 1 deletion bench.js
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,13 @@
    const { Suite } = require('benchmark')
    const { useReduce, useFilterMap, useFromEntries, useTransduce, useLoop } = require('./impls')

    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]))
    8 changes: 8 additions & 0 deletions impls.js
    Original 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,
  4. jcoglan revised this gist May 25, 2021. 3 changed files with 48 additions and 27 deletions.
    44 changes: 25 additions & 19 deletions README.md
    Original file line number Diff line number Diff line change
    @@ -1,24 +1,30 @@
    # 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)
    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 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)
    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)

    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)
    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)

    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)
    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)
    8 changes: 7 additions & 1 deletion bench.js
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,5 @@
    const { Suite } = require('benchmark')
    const { useReduce, useFilterMap, useLoop, useTransduce } = require('./impls')
    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]))
    23 changes: 16 additions & 7 deletions impls.js
    Original file line number Diff line number Diff line change
    @@ -14,12 +14,12 @@ function useFilterMap(users) {
    .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 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,
    useTransduce
    }
  5. jcoglan created this gist May 25, 2021.
    24 changes: 24 additions & 0 deletions README.md
    Original 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)
    47 changes: 47 additions & 0 deletions bench.js
    Original 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()
    54 changes: 54 additions & 0 deletions impls.js
    Original 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
    }