Skip to content

aearly/icepick-benchmarks

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

icepick benchmarks

Testing:

  • Vanilla, mutable objects (0kB)
  • icepick (1kB)
  • seamless-immutable (2.7kB)
  • immer (6.2kb)
  • Immutable (17.2kB)
  • mori (35.2kB)

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

Tests:

  • create - cast the inpute to the type used by the library. No-op for some libraries.
  • access - read a property on the root
  • assoc - set a single property on the root
  • dissoc - delete a single property on the root
  • accessNested - access a property on a leaf node
  • assocNested - set a property on a leaf node
  • thaw - cast back from the library's type to a plain JS object. No-op for some libraries.

Results

Tested in Node 12. All times in microseconds.

Normal (NODE_ENV=development)

create (µs)
┌───────────┬────────┬─────────┬──────────┬─────────────┬────────────┐
│           │ small  │ large   │ huge     │ smallNested │ hugeNested │
├───────────┼────────┼─────────┼──────────┼─────────────┼────────────┤
│ vanilla   │ 0.462  │ 0.676   │ 0.911    │ 0.111       │ 0.107      │
│ icepick   │ 2.450  │ 6.867   │ 101.570  │ 32.465      │ 2803.423   │
│ seamless  │ 8.187  │ 17.872  │ 200.097  │ 601.265     │ 28979.266  │
│ immer     │ 2.377  │ 4.748   │ 12.797   │ 0.860       │ 1.870      │
│ Immutable │ 21.270 │ 32.630  │ 255.182  │ 241.805     │ 36034.467  │
│ mori      │ 68.563 │ 115.335 │ 1333.723 │ 1001.590    │ 103242.072 │
└───────────┴────────┴─────────┴──────────┴─────────────┴────────────┘

access (µs)
┌───────────┬───────┬───────┬───────┬─────────────┬────────────┐
│           │ small │ large │ huge  │ smallNested │ hugeNested │
├───────────┼───────┼───────┼───────┼─────────────┼────────────┤
│ vanilla   │ 0.306 │ 0.321 │ 0.283 │ 0.331       │ 0.657      │
│ icepick   │ 0.237 │ 0.238 │ 0.207 │ 0.234       │ 0.227      │
│ seamless  │ 0.190 │ 0.164 │ 0.166 │ 0.183       │ 0.180      │
│ immer     │ 0.181 │ 0.202 │ 0.165 │ 0.176       │ 0.178      │
│ Immutable │ 0.402 │ 0.526 │ 0.633 │ 1.040       │ 0.211      │
│ mori      │ 0.943 │ 1.078 │ 4.962 │ 0.570       │ 1.173      │
└───────────┴───────┴───────┴───────┴─────────────┴────────────┘

assoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.216 │ 0.261  │ 0.191   │ 0.419       │ 0.154      │
│ icepick   │ 1.159 │ 8.477  │ 345.839 │ 1.354       │ 0.998      │
│ seamless  │ 6.436 │ 19.796 │ 187.888 │ 6.166       │ 9.858      │
│ immer     │ 9.488 │ 55.489 │ 474.420 │ 7.652       │ 7.959      │
│ Immutable │ 2.696 │ 3.314  │ 2.028   │ 0.657       │ 0.419      │
│ mori      │ 2.038 │ 2.763  │ 6.785   │ 1.890       │ 1.349      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

dissoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.283 │ 0.325  │ 0.289   │ 0.334       │ 0.186      │
│ icepick   │ 2.047 │ 7.264  │ 341.456 │ 1.825       │ 1.875      │
│ seamless  │ 7.802 │ 22.925 │ 199.529 │ 5.774       │ 6.549      │
│ immer     │ 7.721 │ 49.340 │ 452.201 │ 6.024       │ 6.958      │
│ Immutable │ 1.157 │ 0.970  │ 2.042   │ 1.757       │ 0.270      │
│ mori      │ 1.095 │ 1.204  │ 2.141   │ 1.550       │ 1.236      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

accessNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.321       │ 0.350      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 0.398       │ 0.443      │
│ seamless  │ N/A   │ N/A   │ N/A  │ 0.387       │ 0.416      │
│ immer     │ N/A   │ N/A   │ N/A  │ 0.686       │ 0.373      │
│ Immutable │ N/A   │ N/A   │ N/A  │ 1.097       │ 2.741      │
│ mori      │ N/A   │ N/A   │ N/A  │ 1.623       │ 3.326      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

assocNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.382       │ 0.406      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 4.911       │ 26.359     │
│ seamless  │ N/A   │ N/A   │ N/A  │ 24.121      │ 59.691     │
│ immer     │ N/A   │ N/A   │ N/A  │ 25.568      │ 86.590     │
│ Immutable │ N/A   │ N/A   │ N/A  │ 3.948       │ 2.575      │
│ mori      │ N/A   │ N/A   │ N/A  │ 3.956       │ 6.292      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

thaw (µs)
┌───────────┬────────┬────────┬─────────┬─────────────┬────────────┐
│           │ small  │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼────────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.075  │ 0.076  │ 0.077   │ 0.075       │ 0.075      │
│ icepick   │ 1.913  │ 13.354 │ 451.848 │ 89.189      │ 19134.710  │
│ seamless  │ 1.984  │ 18.923 │ 168.507 │ 98.237      │ 15003.773  │
│ immer     │ 0.112  │ 0.109  │ 0.110   │ 0.107       │ 0.119      │
│ Immutable │ 4.979  │ 15.203 │ 124.447 │ 112.739     │ 14695.695  │
│ mori      │ 16.199 │ 61.295 │ 655.445 │ 450.061     │ 61517.868  │
└───────────┴────────┴────────┴─────────┴─────────────┴────────────┘

done

NODE_ENV=production

create (µs)
┌───────────┬────────┬─────────┬──────────┬─────────────┬────────────┐
│           │ small  │ large   │ huge     │ smallNested │ hugeNested │
├───────────┼────────┼─────────┼──────────┼─────────────┼────────────┤
│ vanilla   │ 0.514  │ 3.478   │ 0.927    │ 0.114       │ 0.110      │
│ icepick   │ 0.434  │ 0.459   │ 0.433    │ 0.432       │ 0.457      │
│ seamless  │ 8.184  │ 19.769  │ 185.535  │ 518.435     │ 25522.695  │
│ immer     │ 1.905  │ 1.801   │ 3.028    │ 1.850       │ 1.235      │
│ Immutable │ 25.700 │ 42.339  │ 315.511  │ 387.084     │ 34871.356  │
│ mori      │ 65.605 │ 106.462 │ 1351.273 │ 1013.282    │ 104081.542 │
└───────────┴────────┴─────────┴──────────┴─────────────┴────────────┘

access (µs)
┌───────────┬───────┬───────┬───────┬─────────────┬────────────┐
│           │ small │ large │ huge  │ smallNested │ hugeNested │
├───────────┼───────┼───────┼───────┼─────────────┼────────────┤
│ vanilla   │ 0.306 │ 0.312 │ 0.285 │ 0.327       │ 0.633      │
│ icepick   │ 0.271 │ 0.240 │ 0.213 │ 0.229       │ 0.250      │
│ seamless  │ 0.177 │ 0.164 │ 0.162 │ 0.175       │ 0.176      │
│ immer     │ 0.176 │ 0.188 │ 0.164 │ 0.171       │ 0.174      │
│ Immutable │ 0.394 │ 0.491 │ 0.597 │ 1.567       │ 0.164      │
│ mori      │ 0.972 │ 0.943 │ 3.226 │ 1.155       │ 1.703      │
└───────────┴───────┴───────┴───────┴─────────────┴────────────┘

assoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.220 │ 0.240  │ 0.195   │ 0.206       │ 0.204      │
│ icepick   │ 1.112 │ 7.405  │ 334.451 │ 1.136       │ 0.908      │
│ seamless  │ 6.992 │ 18.132 │ 169.373 │ 4.737       │ 4.548      │
│ immer     │ 8.763 │ 47.239 │ 388.661 │ 7.262       │ 7.276      │
│ Immutable │ 2.608 │ 2.812  │ 2.961   │ 1.022       │ 0.246      │
│ mori      │ 2.117 │ 2.969  │ 6.374   │ 0.965       │ 1.590      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

dissoc (µs)
┌───────────┬───────┬────────┬─────────┬─────────────┬────────────┐
│           │ small │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼───────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.165 │ 0.166  │ 0.169   │ 0.328       │ 0.164      │
│ icepick   │ 1.453 │ 6.287  │ 331.930 │ 1.456       │ 1.942      │
│ seamless  │ 6.654 │ 21.606 │ 190.613 │ 4.752       │ 5.499      │
│ immer     │ 6.569 │ 38.178 │ 381.094 │ 4.909       │ 5.140      │
│ Immutable │ 1.017 │ 1.003  │ 1.795   │ 1.177       │ 0.298      │
│ mori      │ 1.075 │ 1.259  │ 2.122   │ 0.699       │ 2.023      │
└───────────┴───────┴────────┴─────────┴─────────────┴────────────┘

accessNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.328       │ 0.356      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 0.326       │ 0.339      │
│ seamless  │ N/A   │ N/A   │ N/A  │ 0.379       │ 0.385      │
│ immer     │ N/A   │ N/A   │ N/A  │ 0.695       │ 0.365      │
│ Immutable │ N/A   │ N/A   │ N/A  │ 0.972       │ 2.075      │
│ mori      │ N/A   │ N/A   │ N/A  │ 1.688       │ 3.286      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

assocNested (µs)
┌───────────┬───────┬───────┬──────┬─────────────┬────────────┐
│           │ small │ large │ huge │ smallNested │ hugeNested │
├───────────┼───────┼───────┼──────┼─────────────┼────────────┤
│ vanilla   │ N/A   │ N/A   │ N/A  │ 0.387       │ 0.393      │
│ icepick   │ N/A   │ N/A   │ N/A  │ 4.164       │ 10.652     │
│ seamless  │ N/A   │ N/A   │ N/A  │ 17.562      │ 39.049     │
│ immer     │ N/A   │ N/A   │ N/A  │ 21.514      │ 65.586     │
│ Immutable │ N/A   │ N/A   │ N/A  │ 4.656       │ 3.564      │
│ mori      │ N/A   │ N/A   │ N/A  │ 4.993       │ 5.128      │
└───────────┴───────┴───────┴──────┴─────────────┴────────────┘

thaw (µs)
┌───────────┬────────┬────────┬─────────┬─────────────┬────────────┐
│           │ small  │ large  │ huge    │ smallNested │ hugeNested │
├───────────┼────────┼────────┼─────────┼─────────────┼────────────┤
│ vanilla   │ 0.073  │ 0.073  │ 0.073   │ 0.074       │ 0.072      │
│ icepick   │ 0.311  │ 0.280  │ 0.287   │ 0.291       │ 0.507      │
│ seamless  │ 1.836  │ 16.212 │ 166.069 │ 96.359      │ 14607.656  │
│ immer     │ 0.073  │ 0.073  │ 0.074   │ 0.072       │ 0.095      │
│ Immutable │ 5.745  │ 14.819 │ 121.769 │ 116.742     │ 15033.459  │
│ mori      │ 18.575 │ 60.896 │ 656.461 │ 455.421     │ 61429.594  │
└───────────┴────────┴────────┴─────────┴─────────────┴────────────┘

done

About

Benchmark icepick vs other immutable libraries

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published