Skip to content

Instantly share code, notes, and snippets.

@ryanwarsaw
Last active February 9, 2017 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryanwarsaw/1ecdefb68d9a9bbff47ddf21f025b40b to your computer and use it in GitHub Desktop.
Save ryanwarsaw/1ecdefb68d9a9bbff47ddf21f025b40b to your computer and use it in GitHub Desktop.
Comparison of bcrypt.js performance on i7 4960HQ vs Heroku hardware 🤔
~ $ npm test
> bcryptjs@2.4.3 test /app
> node node_modules/testjs/bin/testjs
|_ _ _|_
|_(-_)|_ test.js v1.0.4
+ bcryptjs.encodeBase64 0.866 ms 1 assertions
+ bcryptjs.decodeBase64 3.339 ms 1 assertions
+ bcryptjs.genSaltSync 0.608 ms 3 assertions
+ bcryptjs.genSalt 0.674 ms 3 assertions
+ bcryptjs.hashSync 421.399 ms 2 assertions
+ bcryptjs.hash 114.708 ms 2 assertions
+ bcryptjs.compareSync 1329.529 ms 12 assertions
+ bcryptjs.compare 670.718 ms 8 assertions
+ bcryptjs.getSalt 224.157 ms 1 assertions
+ bcryptjs.getRounds 111.089 ms 1 assertions
+ bcryptjs.progress 441.625 ms 6 assertions
+ bcryptjs.promise 226.028 ms 3 assertions
+ bcryptjs.compat.quickbrown 189.902 ms 1 assertions
+ bcryptjs.compat.roundsOOB 0.612 ms 6 assertions
test OK 14 tests (3742.969 ms, 50 assertions)
~ $
~ $ node tests/bench
bcrypt.js maximum input length is: 72
## Comparing bcryptjs with bcrypt
#### Using 8 rounds
Salt: `$2a$08$BzZyYtTRd31wSoOshhPvbe`
* **bcrypt** sync: 21.049ms
`$2a$08$BzZyYtTRd31wSoOshhPvbeZWq3cGvXGwCLNxbtkRs5d4Z6s0jwyUa`
* **bcrypt.js** sync: 33.847ms
`$2a$08$BzZyYtTRd31wSoOshhPvbeZWq3cGvXGwCLNxbtkRs5d4Z6s0jwyUa`
* **bcrypt** async: 20.926ms
`$2a$08$BzZyYtTRd31wSoOshhPvbeZWq3cGvXGwCLNxbtkRs5d4Z6s0jwyUa`
* **bcrypt.js** async: 37.189ms
`$2a$08$BzZyYtTRd31wSoOshhPvbeZWq3cGvXGwCLNxbtkRs5d4Z6s0jwyUa`
#### Using 9 rounds
Salt: `$2a$09$FHGVRlHNlC.RXViMBFXNsu`
* **bcrypt** sync: 41.610ms
`$2a$09$FHGVRlHNlC.RXViMBFXNsueqA7qCo9Q9ddx2FSScatM0.PTxlhUDy`
* **bcrypt.js** sync: 56.918ms
`$2a$09$FHGVRlHNlC.RXViMBFXNsueqA7qCo9Q9ddx2FSScatM0.PTxlhUDy`
* **bcrypt** async: 38.873ms
`$2a$09$FHGVRlHNlC.RXViMBFXNsueqA7qCo9Q9ddx2FSScatM0.PTxlhUDy`
* **bcrypt.js** async: 63.882ms
`$2a$09$FHGVRlHNlC.RXViMBFXNsueqA7qCo9Q9ddx2FSScatM0.PTxlhUDy`
#### Using 10 rounds
Salt: `$2a$10$BTpVIDlYuKaV8ncZNho.qu`
* **bcrypt** sync: 78.517ms
`$2a$10$BTpVIDlYuKaV8ncZNho.qu98BVAiXLPhlwxRpXnYUwKwwi6rVVUym`
* **bcrypt.js** sync: 115.701ms
`$2a$10$BTpVIDlYuKaV8ncZNho.qu98BVAiXLPhlwxRpXnYUwKwwi6rVVUym`
* **bcrypt** async: 77.517ms
`$2a$10$BTpVIDlYuKaV8ncZNho.qu98BVAiXLPhlwxRpXnYUwKwwi6rVVUym`
* **bcrypt.js** async: 116.572ms
`$2a$10$BTpVIDlYuKaV8ncZNho.qu98BVAiXLPhlwxRpXnYUwKwwi6rVVUym`
#### Using 11 rounds
Salt: `$2a$11$dJxd/m2pGszJozLqjHsFAe`
* **bcrypt** sync: 177.466ms
`$2a$11$dJxd/m2pGszJozLqjHsFAefglwm.FqcPRD9m/QH1XAPkBQlbpTAh.`
* **bcrypt.js** sync: 278.313ms
`$2a$11$dJxd/m2pGszJozLqjHsFAefglwm.FqcPRD9m/QH1XAPkBQlbpTAh.`
* **bcrypt** async: 155.523ms
`$2a$11$dJxd/m2pGszJozLqjHsFAefglwm.FqcPRD9m/QH1XAPkBQlbpTAh.`
* **bcrypt.js** async: 227.835ms
`$2a$11$dJxd/m2pGszJozLqjHsFAefglwm.FqcPRD9m/QH1XAPkBQlbpTAh.`
#### Using 12 rounds
Salt: `$2a$12$UCn2FcSe3OJItVXKyM8hQe`
* **bcrypt** sync: 318.310ms
`$2a$12$UCn2FcSe3OJItVXKyM8hQeFt.lZ5Ilx7UjsHgpXVO9SnpX45orF2W`
* **bcrypt.js** sync: 467.182ms
`$2a$12$UCn2FcSe3OJItVXKyM8hQeFt.lZ5Ilx7UjsHgpXVO9SnpX45orF2W`
* **bcrypt** async: 311.926ms
`$2a$12$UCn2FcSe3OJItVXKyM8hQeFt.lZ5Ilx7UjsHgpXVO9SnpX45orF2W`
* **bcrypt.js** async: 490.588ms
`$2a$12$UCn2FcSe3OJItVXKyM8hQeFt.lZ5Ilx7UjsHgpXVO9SnpX45orF2W`
#### Using 13 rounds
Salt: `$2a$13$g3P2tneGDFsqXm0DxwAbeO`
* **bcrypt** sync: 653.669ms
`$2a$13$g3P2tneGDFsqXm0DxwAbeOtrtdR8QX/3cA3VAMdsPw/mQgBpHKbfq`
* **bcrypt.js** sync: 987.713ms
`$2a$13$g3P2tneGDFsqXm0DxwAbeOtrtdR8QX/3cA3VAMdsPw/mQgBpHKbfq`
* **bcrypt** async: 621.518ms
`$2a$13$g3P2tneGDFsqXm0DxwAbeOtrtdR8QX/3cA3VAMdsPw/mQgBpHKbfq`
* **bcrypt.js** async: 978.093ms
`$2a$13$g3P2tneGDFsqXm0DxwAbeOtrtdR8QX/3cA3VAMdsPw/mQgBpHKbfq`
#### Using 14 rounds
Salt: `$2a$14$Uwe8y271bbfB3oL3gZxM9O`
* **bcrypt** sync: 1329.344ms
`$2a$14$Uwe8y271bbfB3oL3gZxM9OPMHhXVzqaoUccvuHx7HXj0zH3.SbYXi`
* **bcrypt.js** sync: 1923.914ms
`$2a$14$Uwe8y271bbfB3oL3gZxM9OPMHhXVzqaoUccvuHx7HXj0zH3.SbYXi`
* **bcrypt** async: 1252.934ms
`$2a$14$Uwe8y271bbfB3oL3gZxM9OPMHhXVzqaoUccvuHx7HXj0zH3.SbYXi`
* **bcrypt.js** async: 1797.935ms
`$2a$14$Uwe8y271bbfB3oL3gZxM9OPMHhXVzqaoUccvuHx7HXj0zH3.SbYXi`
#### Using 15 rounds
Salt: `$2a$15$/Ww7F5W2t/tWjyUiXgxnXe`
* **bcrypt** sync: 2584.945ms
`$2a$15$/Ww7F5W2t/tWjyUiXgxnXe6phBrw275v0bgJAm7IOJ7d5OMoJM3wO`
* **bcrypt.js** sync: 3635.123ms
`$2a$15$/Ww7F5W2t/tWjyUiXgxnXe6phBrw275v0bgJAm7IOJ7d5OMoJM3wO`
* **bcrypt** async: 2558.177ms
`$2a$15$/Ww7F5W2t/tWjyUiXgxnXe6phBrw275v0bgJAm7IOJ7d5OMoJM3wO`
* **bcrypt.js** async: 3606.093ms
`$2a$15$/Ww7F5W2t/tWjyUiXgxnXe6phBrw275v0bgJAm7IOJ7d5OMoJM3wO`
Ryans-MacBook-Pro:bcrypt.js ryanwarsaw$ npm test
> bcryptjs@2.4.3 test /Users/ryanwarsaw/Development/JavaScript/bcrypt.js
> node node_modules/testjs/bin/testjs
|_ _ _|_
|_(-_)|_ test.js v1.0.4
+ bcryptjs.encodeBase64 0.451 ms 1 assertions
+ bcryptjs.decodeBase64 1.110 ms 1 assertions
+ bcryptjs.genSaltSync 0.215 ms 3 assertions
+ bcryptjs.genSalt 0.271 ms 3 assertions
+ bcryptjs.hashSync 254.079 ms 2 assertions
+ bcryptjs.hash 81.552 ms 2 assertions
+ bcryptjs.compareSync 968.597 ms 12 assertions
+ bcryptjs.compare 495.584 ms 8 assertions
+ bcryptjs.getSalt 163.371 ms 1 assertions
+ bcryptjs.getRounds 81.340 ms 1 assertions
+ bcryptjs.progress 319.050 ms 6 assertions
+ bcryptjs.promise 165.267 ms 3 assertions
+ bcryptjs.compat.quickbrown 146.806 ms 1 assertions
+ bcryptjs.compat.roundsOOB 0.669 ms 6 assertions
test OK 14 tests (2681.935 ms, 50 assertions)
Ryans-MacBook-Pro:bcrypt.js ryanwarsaw$
bcrypt.js maximum input length is: 72
## Comparing bcryptjs with bcrypt
#### Using 8 rounds
Salt: `$2a$08$tIdhWWCHHNS4Vhw4nLAkh.`
* **bcrypt** sync: 16.413ms
`$2a$08$tIdhWWCHHNS4Vhw4nLAkh.n90Cw8MEQXVjvfeoJcpAgcN00cwkdtC`
* **bcrypt.js** sync: 19.919ms
`$2a$08$tIdhWWCHHNS4Vhw4nLAkh.n90Cw8MEQXVjvfeoJcpAgcN00cwkdtC`
* **bcrypt** async: 21.770ms
`$2a$08$tIdhWWCHHNS4Vhw4nLAkh.n90Cw8MEQXVjvfeoJcpAgcN00cwkdtC`
* **bcrypt.js** async: 21.527ms
`$2a$08$tIdhWWCHHNS4Vhw4nLAkh.n90Cw8MEQXVjvfeoJcpAgcN00cwkdtC`
#### Using 9 rounds
Salt: `$2a$09$C2HtIGHtD80NKlysTc5C5.`
* **bcrypt** sync: 33.443ms
`$2a$09$C2HtIGHtD80NKlysTc5C5.JmAmuec84OTvbkQo/9U1fq4bl4skrqC`
* **bcrypt.js** sync: 41.419ms
`$2a$09$C2HtIGHtD80NKlysTc5C5.JmAmuec84OTvbkQo/9U1fq4bl4skrqC`
* **bcrypt** async: 33.932ms
`$2a$09$C2HtIGHtD80NKlysTc5C5.JmAmuec84OTvbkQo/9U1fq4bl4skrqC`
* **bcrypt.js** async: 41.438ms
`$2a$09$C2HtIGHtD80NKlysTc5C5.JmAmuec84OTvbkQo/9U1fq4bl4skrqC`
#### Using 10 rounds
Salt: `$2a$10$pAqYjdQYytRyB5BSI6zuY.`
* **bcrypt** sync: 67.315ms
`$2a$10$pAqYjdQYytRyB5BSI6zuY.A18rftYwu92qoLvDqmbJth2JYJoEyOS`
* **bcrypt.js** sync: 81.625ms
`$2a$10$pAqYjdQYytRyB5BSI6zuY.A18rftYwu92qoLvDqmbJth2JYJoEyOS`
* **bcrypt** async: 67.469ms
`$2a$10$pAqYjdQYytRyB5BSI6zuY.A18rftYwu92qoLvDqmbJth2JYJoEyOS`
* **bcrypt.js** async: 87.125ms
`$2a$10$pAqYjdQYytRyB5BSI6zuY.A18rftYwu92qoLvDqmbJth2JYJoEyOS`
#### Using 11 rounds
Salt: `$2a$11$7S6jV3dJt7JHA04jQJsIiu`
* **bcrypt** sync: 137.128ms
`$2a$11$7S6jV3dJt7JHA04jQJsIiuXEFcxI4ya9/d1In.6y0F07ZSDIVHBnC`
* **bcrypt.js** sync: 162.033ms
`$2a$11$7S6jV3dJt7JHA04jQJsIiuXEFcxI4ya9/d1In.6y0F07ZSDIVHBnC`
* **bcrypt** async: 129.830ms
`$2a$11$7S6jV3dJt7JHA04jQJsIiuXEFcxI4ya9/d1In.6y0F07ZSDIVHBnC`
* **bcrypt.js** async: 166.848ms
`$2a$11$7S6jV3dJt7JHA04jQJsIiuXEFcxI4ya9/d1In.6y0F07ZSDIVHBnC`
#### Using 12 rounds
Salt: `$2a$12$Pkh427sr4pGXHVAHiHA8nu`
* **bcrypt** sync: 264.059ms
`$2a$12$Pkh427sr4pGXHVAHiHA8nucoc9.qToQBumGz65doVljN8rKatUAPC`
* **bcrypt.js** sync: 320.189ms
`$2a$12$Pkh427sr4pGXHVAHiHA8nucoc9.qToQBumGz65doVljN8rKatUAPC`
* **bcrypt** async: 263.666ms
`$2a$12$Pkh427sr4pGXHVAHiHA8nucoc9.qToQBumGz65doVljN8rKatUAPC`
* **bcrypt.js** async: 321.545ms
`$2a$12$Pkh427sr4pGXHVAHiHA8nucoc9.qToQBumGz65doVljN8rKatUAPC`
#### Using 13 rounds
Salt: `$2a$13$c3gCt1I2pvidpxxAyCVlB.`
* **bcrypt** sync: 545.440ms
`$2a$13$c3gCt1I2pvidpxxAyCVlB.THE046NpRSfa8rgK4oWXosy2ZLUzpvy`
* **bcrypt.js** sync: 657.998ms
`$2a$13$c3gCt1I2pvidpxxAyCVlB.THE046NpRSfa8rgK4oWXosy2ZLUzpvy`
* **bcrypt** async: 516.360ms
`$2a$13$c3gCt1I2pvidpxxAyCVlB.THE046NpRSfa8rgK4oWXosy2ZLUzpvy`
* **bcrypt.js** async: 639.311ms
`$2a$13$c3gCt1I2pvidpxxAyCVlB.THE046NpRSfa8rgK4oWXosy2ZLUzpvy`
#### Using 14 rounds
Salt: `$2a$14$AyXxw1NVVubrCNl.HJFeEe`
* **bcrypt** sync: 1038.704ms
`$2a$14$AyXxw1NVVubrCNl.HJFeEep/Typ0MXde2Isuo7bnRm9RQLP0px5su`
* **bcrypt.js** sync: 1279.357ms
`$2a$14$AyXxw1NVVubrCNl.HJFeEep/Typ0MXde2Isuo7bnRm9RQLP0px5su`
* **bcrypt** async: 1041.455ms
`$2a$14$AyXxw1NVVubrCNl.HJFeEep/Typ0MXde2Isuo7bnRm9RQLP0px5su`
* **bcrypt.js** async: 1277.026ms
`$2a$14$AyXxw1NVVubrCNl.HJFeEep/Typ0MXde2Isuo7bnRm9RQLP0px5su`
#### Using 15 rounds
Salt: `$2a$15$6iQAM.kGz5bUQq9zQuUwyO`
* **bcrypt** sync: 2073.580ms
`$2a$15$6iQAM.kGz5bUQq9zQuUwyOdJN0YzEX2JK5s6heHygps0PRQapH6EW`
* **bcrypt.js** sync: 2546.767ms
`$2a$15$6iQAM.kGz5bUQq9zQuUwyOdJN0YzEX2JK5s6heHygps0PRQapH6EW`
* **bcrypt** async: 2069.854ms
`$2a$15$6iQAM.kGz5bUQq9zQuUwyOdJN0YzEX2JK5s6heHygps0PRQapH6EW`
* **bcrypt.js** async: 2540.838ms
`$2a$15$6iQAM.kGz5bUQq9zQuUwyOdJN0YzEX2JK5s6heHygps0PRQapH6EW`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment