Awesome
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 propertieslarge
- Object with 100 propertieshuge
- Object with 1000 propertiessmallNested
- Object with 10 properties, each an array of 10 objects each with 10 propertieshugeNested
- 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 rootassoc
- set a single property on the rootdissoc
- delete a single property on the rootaccessNested
- access a property on a leaf nodeassocNested
- set a property on a leaf nodethaw
- 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