Benchmark icepick vs other immutable libraries
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
.gitignore
README.md
benchmark.js
index.js
package-lock.json
package.json
tests.js

README.md

icepick benchmarks

Testing:

  • Vanilla, mutable objects
  • icepick
  • seamless-immutable
  • Immutable
  • mori

With inputs:

  • small - Object with 10 properties
  • large - Object with 100 properties
  • huge - Object with 1000 properties
  • smallNested - Object with 10 properties, each an array of 10 objects each with 10 properties
  • hugeNested - Object with 10 properties, each an array of 100 objects each with 100 properties

Results

Tested in Node 8. All times in microseconds.

Normal

create (µs)
┌───────────┬────────┬─────────┬──────────┬─────────────┬────────────┐
│           │ small  │ large   │ huge     │ smallNested │ hugeNested │
├───────────┼────────┼─────────┼──────────┼─────────────┼────────────┤
│ vanilla   │ 0.632  │ 0.085   │ 0.078    │ 0.084       │ 0.070      │
│ icepick   │ 4.557  │ 10.857  │ 131.031  │ 89.679      │ 5201.574   │
│ seamless  │ 7.421  │ 36.514  │ 300.530  │ 746.807     │ 48780.596  │
│ Immutable │ 14.266 │ 35.891  │ 361.849  │ 581.958     │ 78167.799  │
│ mori      │ 79.637 │ 182.536 │ 2267.988 │ 1789.279    │ 200861.059 │
└───────────┴────────┴─────────┴──────────┴─────────────┴────────────┘

access (µs)
┌───────────┬───────┬───────┬───────┬─────────────┬────────────┐
│           │ small │ large │ huge  │ smallNested │ hugeNested │
├───────────┼───────┼───────┼───────┼─────────────┼────────────┤
│ vanilla   │ 0.514 │ 0.313 │ 0.197 │ 0.309       │ 0.251      │
│ icepick   │ 0.267 │ 0.349 │ 0.186 │ 0.238       │ 0.234      │
│ seamless  │ 0.228 │ 0.241 │ 0.154 │ 0.238       │ 0.359      │
│ Immutable │ 1.305 │ 1.614 │ 1.650 │ 0.134       │ 0.137      │
│ mori      │ 1.316 │ 2.590 │ 1.046 │ 0.442       │ 0.575      │
└───────────┴───────┴───────┴───────┴─────────────┴────────────┘

assoc (µs)
┌───────────┬────────┬────────┬─────────┬─────────────┬────────────┐
│           │ small  │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼────────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.488  │ 0.325  │ 0.267   │ 0.321       │ 0.256      │
│ icepick   │ 2.363  │ 12.016 │ 175.833 │ 1.647       │ 0.971      │
│ seamless  │ 8.255  │ 43.965 │ 282.315 │ 7.221       │ 6.345      │
│ Immutable │ 2.919  │ 5.857  │ 0.560   │ 0.753       │ 0.287      │
│ mori      │ 22.949 │ 3.823  │ 1.215   │ 1.478       │ 0.817      │
└───────────┴────────┴────────┴─────────┴─────────────┴────────────┘

dissoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.371 │ 0.208  │ 0.216   │ 0.213       │ 0.191      │
│ icepick   │ 2.095 │ 11.030 │ 202.742 │ 1.518       │ 1.600      │
│ seamless  │ 6.277 │ 25.651 │ 232.006 │ 5.724       │ 9.291      │
│ Immutable │ 1.670 │ 2.156  │ 0.654   │ 0.287       │ 0.294      │
│ mori      │ 4.305 │ 4.933  │ 1.564   │ 0.648       │ 0.759      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

accessNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.807       │ 0.431      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 0.695       │ 0.413      │
│ seamless  │ N/A   │ N/A   │ N/A  │ 0.453       │ 0.469      │
│ Immutable │ N/A   │ N/A   │ N/A  │ 3.094       │ 0.880      │
│ mori      │ N/A   │ N/A   │ N/A  │ 3.818       │ 2.764      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

assocNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.915       │ 0.453      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 10.118      │ 66.863     │
│ seamless  │ N/A   │ N/A   │ N/A  │ 32.045      │ 80.523     │
│ Immutable │ N/A   │ N/A   │ N/A  │ 5.806       │ 2.607      │
│ mori      │ N/A   │ N/A   │ N/A  │ 5.344       │ 5.939      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

thaw (µs)
┌───────────┬────────┬────────┬─────────┬─────────────┬────────────┐
│           │ small  │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼────────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.119  │ 0.078  │ 0.077   │ 0.075       │ 0.060      │
│ icepick   │ 2.788  │ 36.634 │ 364.902 │ 248.680     │ 47026.212  │
│ seamless  │ 1.524  │ 13.957 │ 190.755 │ 115.401     │ 10217.606  │
│ Immutable │ 4.267  │ 12.060 │ 121.602 │ 253.691     │ 17526.608  │
│ mori      │ 12.071 │ 76.355 │ 883.229 │ 675.975     │ 78943.627  │
└───────────┴────────┴────────┴─────────┴─────────────┴────────────┘

done

NODE_ENV=production

┌───────────┬────────┬─────────┬──────────┬─────────────┬────────────┐
│           │ small  │ large   │ huge     │ smallNested │ hugeNested │
├───────────┼────────┼─────────┼──────────┼─────────────┼────────────┤
│ vanilla   │ 0.725  │ 0.103   │ 0.081    │ 0.081       │ 0.070      │
│ icepick   │ 0.173  │ 0.071   │ 0.061    │ 0.065       │ 0.059      │
│ seamless  │ 6.772  │ 45.400  │ 292.010  │ 731.008     │ 44492.397  │
│ Immutable │ 13.913 │ 35.068  │ 333.583  │ 514.856     │ 75306.757  │
│ mori      │ 88.915 │ 184.713 │ 2224.410 │ 1949.820    │ 208595.188 │
└───────────┴────────┴─────────┴──────────┴─────────────┴────────────┘

access (µs)
┌───────────┬───────┬───────┬───────┬─────────────┬────────────┐
│           │ small │ large │ huge  │ smallNested │ hugeNested │
├───────────┼───────┼───────┼───────┼─────────────┼────────────┤
│ vanilla   │ 0.486 │ 0.301 │ 0.191 │ 0.291       │ 0.480      │
│ icepick   │ 0.276 │ 0.319 │ 0.182 │ 0.281       │ 0.361      │
│ seamless  │ 0.339 │ 0.340 │ 0.207 │ 0.416       │ 0.254      │
│ Immutable │ 1.333 │ 1.654 │ 1.461 │ 0.143       │ 0.136      │
│ mori      │ 1.085 │ 2.967 │ 0.845 │ 0.416       │ 0.523      │
└───────────┴───────┴───────┴───────┴─────────────┴────────────┘

assoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.398 │ 0.266  │ 0.227   │ 0.256       │ 0.244      │
│ icepick   │ 1.636 │ 10.435 │ 152.415 │ 1.538       │ 0.875      │
│ seamless  │ 6.557 │ 39.613 │ 271.636 │ 6.015       │ 6.598      │
│ Immutable │ 2.952 │ 2.304  │ 0.583   │ 0.564       │ 0.290      │
│ mori      │ 3.786 │ 4.948  │ 16.086  │ 0.996       │ 1.432      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

dissoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.357 │ 0.195  │ 0.194   │ 0.186       │ 0.182      │
│ icepick   │ 1.792 │ 10.565 │ 180.239 │ 1.146       │ 1.146      │
│ seamless  │ 5.547 │ 22.321 │ 223.491 │ 5.255       │ 5.231      │
│ Immutable │ 1.816 │ 2.416  │ 4.021   │ 0.307       │ 0.285      │
│ mori      │ 4.022 │ 19.509 │ 1.592   │ 0.708       │ 0.701      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

accessNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.671       │ 0.786      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 0.666       │ 0.395      │
│ seamless  │ N/A   │ N/A   │ N/A  │ 0.651       │ 0.382      │
│ Immutable │ N/A   │ N/A   │ N/A  │ 1.803       │ 0.958      │
│ mori      │ N/A   │ N/A   │ N/A  │ 3.338       │ 2.791      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

assocNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.807       │ 0.412      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 3.294       │ 15.612     │
│ seamless  │ N/A   │ N/A   │ N/A  │ 22.647      │ 66.757     │
│ Immutable │ N/A   │ N/A   │ N/A  │ 4.977       │ 17.616     │
│ mori      │ N/A   │ N/A   │ N/A  │ 5.531       │ 5.235      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

thaw (µs)
┌───────────┬────────┬────────┬─────────┬─────────────┬────────────┐
│           │ small  │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼────────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.105  │ 0.068  │ 0.072   │ 0.064       │ 0.058      │
│ icepick   │ 0.720  │ 0.607  │ 0.550   │ 0.105       │ 0.105      │
│ seamless  │ 1.442  │ 14.114 │ 183.151 │ 108.259     │ 10354.668  │
│ Immutable │ 4.891  │ 15.854 │ 161.304 │ 275.699     │ 18115.734  │
│ mori      │ 12.294 │ 78.886 │ 891.285 │ 716.416     │ 88983.289  │
└───────────┴────────┴────────┴─────────┴─────────────┴────────────┘

done