{"_id":"reusify","_rev":"3957214","name":"reusify","description":"Reuse objects and functions with style","dist-tags":{"latest":"1.1.0"},"maintainers":[{"name":"matteo.collina","email":""}],"time":{"modified":"2025-09-01T01:42:20.000Z","created":"2015-09-11T22:13:22.776Z","1.1.0":"2025-02-25T16:00:49.941Z","1.0.4":"2018-01-26T09:28:18.775Z","1.0.3":"2017-10-06T20:38:10.606Z","1.0.2":"2017-07-20T08:03:07.428Z","1.0.1":"2015-12-16T15:33:41.090Z","1.0.0":"2015-09-11T22:13:22.776Z"},"users":{"blitzprog":true,"majgis":true,"hengkiardo":true,"bajtos":true},"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"versions":{"1.1.0":{"name":"reusify","version":"1.1.0","description":"Reuse objects and functions with style","main":"reusify.js","types":"reusify.d.ts","scripts":{"lint":"eslint","test":"tape test.js","test:coverage":"c8 --100 tape test.js","test:typescript":"tsc"},"pre-commit":["lint","test","test:typescript"],"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"keywords":["reuse","object","performance","function","fast"],"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"license":"MIT","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"homepage":"https://github.com/mcollina/reusify#readme","engines":{"node":">=0.10.0","iojs":">=1.0.0"},"devDependencies":{"@types/node":"^22.9.0","eslint":"^9.13.0","neostandard":"^0.12.0","pre-commit":"^1.2.2","tape":"^5.0.0","c8":"^10.1.2","typescript":"^5.2.2"},"dependencies":{},"_id":"reusify@1.1.0","gitHead":"b2b16eef390ac330068c1ccea4fdec233f4d0f6a","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"shasum":"0fe13b9522e1473f51b558ee796e08f11f9b489f","size":4683,"noattachment":false,"key":"/reusify/-/reusify-1.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/reusify/download/reusify-1.1.0.tgz"},"_npmUser":{"name":"matteo.collina","email":"hello@matteocollina.com"},"directories":{},"maintainers":[{"name":"matteo.collina","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/reusify_1.1.0_1740499249782_0.4468161870600842"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2025-02-25T16:00:49.941Z","publish_time":1740499249941,"_source_registry_name":"default","_cnpm_publish_time":1740499249941},"1.0.4":{"name":"reusify","version":"1.0.4","description":"Reuse objects and functions with style","main":"reusify.js","scripts":{"lint":"standard","test":"tape test.js | faucet","istanbul":"istanbul cover tape test.js","coverage":"npm run istanbul; cat coverage/lcov.info | coveralls"},"pre-commit":["lint","test"],"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"keywords":["reuse","object","performance","function","fast"],"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"license":"MIT","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"homepage":"https://github.com/mcollina/reusify#readme","engines":{"node":">=0.10.0","iojs":">=1.0.0"},"devDependencies":{"coveralls":"^2.13.3","faucet":"0.0.1","istanbul":"^0.4.5","pre-commit":"^1.2.2","standard":"^10.0.3","tape":"^4.8.0"},"gitHead":"89420d4369258d0b768aaebfb1843951193d315d","_id":"reusify@1.0.4","_npmVersion":"5.6.0","_nodeVersion":"8.9.4","_npmUser":{"name":"matteo.collina","email":"hello@matteocollina.com"},"dist":{"shasum":"90da382b1e126efc02146e90845a88db12925d76","size":4117,"noattachment":false,"key":"/reusify/-/reusify-1.0.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/reusify/download/reusify-1.0.4.tgz"},"maintainers":[{"name":"matteo.collina","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reusify-1.0.4.tgz_1516958898700_0.8839292053598911"},"directories":{},"publish_time":1516958898775,"_hasShrinkwrap":false,"_cnpm_publish_time":1516958898775},"1.0.3":{"name":"reusify","version":"1.0.3","description":"Reuse objects and functions with style","main":"reusify.js","scripts":{"lint":"standard","test":"tape test.js | faucet","istanbul":"istanbul cover tape test.js","coverage":"npm run istanbul; cat coverage/lcov.info | coveralls"},"pre-commit":["lint","test"],"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"keywords":["reuse","object","performance","function","fast"],"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"license":"MIT","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"homepage":"https://github.com/mcollina/reusify#readme","engines":{"node":">=0.10.0","iojs":">=1.0.0"},"devDependencies":{"coveralls":"^2.13.1","faucet":"0.0.1","istanbul":"^0.4.5","pre-commit":"^1.2.2","standard":"^10.0.0","tape":"^4.7.0"},"gitHead":"1d7ea6292ccf73789503da32caddd920ec8b1ed0","_id":"reusify@1.0.3","_npmVersion":"5.4.2","_nodeVersion":"8.6.0","_npmUser":{"name":"matteo.collina","email":"hello@matteocollina.com"},"dist":{"shasum":"9da7fc786f39400fd6809e3d694b3b28ecd0f38e","size":3826,"noattachment":false,"key":"/reusify/-/reusify-1.0.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/reusify/download/reusify-1.0.3.tgz"},"maintainers":[{"name":"matteo.collina","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reusify-1.0.3.tgz_1507322290520_0.9243531748652458"},"directories":{},"publish_time":1507322290606,"_cnpm_publish_time":1507322290606,"_hasShrinkwrap":false},"1.0.2":{"name":"reusify","version":"1.0.2","description":"Reuse objects and functions with style","main":"reusify.js","scripts":{"lint":"standard","test":"tape test.js | faucet","istanbul":"istanbul cover tape test.js","coverage":"npm run istanbul; cat coverage/lcov.info | coveralls"},"pre-commit":["lint","test"],"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"keywords":["reuse","object","performance","function","fast"],"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"license":"MIT","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"homepage":"https://github.com/mcollina/reusify#readme","engines":{"node":">=0.10.0","iojs":">=1.0.0"},"devDependencies":{"coveralls":"^2.13.1","faucet":"0.0.1","istanbul":"^0.4.5","pre-commit":"^1.2.2","standard":"^10.0.0","tape":"^4.7.0"},"gitHead":"26c9d4d819562a807c2dacbcd1c79b79d32e18d0","_id":"reusify@1.0.2","_npmVersion":"5.3.0","_nodeVersion":"6.11.1","_npmUser":{"name":"matteo.collina","email":"hello@matteocollina.com"},"dist":{"shasum":"e3ca4a613e64daac35d40ff34819e72776bf5d85","size":4145,"noattachment":false,"key":"/reusify/-/reusify-1.0.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/reusify/download/reusify-1.0.2.tgz"},"maintainers":[{"name":"matteo.collina","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/reusify-1.0.2.tgz_1500537786491_0.876660275971517"},"directories":{},"publish_time":1500537787428,"_hasShrinkwrap":false,"_cnpm_publish_time":1500537787428},"1.0.1":{"name":"reusify","version":"1.0.1","description":"Reuse objects and functions with style","main":"reusify.js","scripts":{"lint":"standard","test":"tape test.js | faucet","istanbul":"istanbul cover tape test.js","coverage":"npm run istanbul; cat coverage/lcov.info | coveralls"},"pre-commit":["lint","test"],"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"keywords":["reuse","object","performance","function","fast"],"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"license":"MIT","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"homepage":"https://github.com/mcollina/reusify#readme","engines":{"node":">=0.10.0","iojs":">=1.0.0"},"devDependencies":{"coveralls":"^2.11.6","faucet":"0.0.1","istanbul":"^0.4.1","pre-commit":"^1.1.1","standard":"^5.2.1","tape":"^4.2.0"},"gitHead":"41336018ac1527345d47cb6ec18c5515d0e52b7f","_id":"reusify@1.0.1","_shasum":"f53584367adc825c87431917263fc7aa19118693","_from":".","_npmVersion":"3.4.1","_nodeVersion":"4.2.0","_npmUser":{"name":"matteo.collina","email":"hello@matteocollina.com"},"dist":{"shasum":"f53584367adc825c87431917263fc7aa19118693","size":3845,"noattachment":false,"key":"/reusify/-/reusify-1.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/reusify/download/reusify-1.0.1.tgz"},"maintainers":[{"name":"matteo.collina","email":""}],"directories":{},"publish_time":1450280021090,"_cnpm_publish_time":1450280021090,"_hasShrinkwrap":false},"1.0.0":{"name":"reusify","version":"1.0.0","description":"Reuse objects and functions with style","main":"reusify.js","scripts":{"lint":"standard","test":"tape test.js | faucet "},"pre-commit":["lint","test"],"repository":{"type":"git","url":"git+https://github.com/mcollina/reusify.git"},"keywords":["reuse","object","performance","function","fast"],"author":{"name":"Matteo Collina","email":"hello@matteocollina.com"},"license":"MIT","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"homepage":"https://github.com/mcollina/reusify#readme","devDependencies":{"faucet":"0.0.1","pre-commit":"^1.1.1","standard":"^5.2.1","tape":"^4.2.0"},"gitHead":"460929abe2b5a31fc5e6dae6617242b26f9a5364","_id":"reusify@1.0.0","_shasum":"6e227aacc80b984c542ebe38e29e4ce82e911170","_from":".","_npmVersion":"2.14.2","_nodeVersion":"4.0.0","_npmUser":{"name":"matteo.collina","email":"hello@matteocollina.com"},"dist":{"shasum":"6e227aacc80b984c542ebe38e29e4ce82e911170","size":3501,"noattachment":false,"key":"/reusify/-/reusify-1.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/reusify/download/reusify-1.0.0.tgz"},"maintainers":[{"name":"matteo.collina","email":""}],"directories":{},"publish_time":1442009602776,"_cnpm_publish_time":1442009602776,"_hasShrinkwrap":false}},"readme":"# reusify\n\n[![npm version][npm-badge]][npm-url]\n\nReuse your objects and functions for maximum speed. This technique will\nmake any function run ~10% faster. You call your functions a\nlot, and it adds up quickly in hot code paths.\n\n```\n$ node benchmarks/createNoCodeFunction.js\nTotal time 53133\nTotal iterations 100000000\nIteration/s 1882069.5236482036\n\n$ node benchmarks/reuseNoCodeFunction.js\nTotal time 50617\nTotal iterations 100000000\nIteration/s 1975620.838848608\n```\n\nThe above benchmark uses fibonacci to simulate a real high-cpu load.\nThe actual numbers might differ for your use case, but the difference\nshould not.\n\nThe benchmark was taken using Node v6.10.0.\n\nThis library was extracted from\n[fastparallel](http://npm.im/fastparallel).\n\n## Example\n\n```js\nvar reusify = require('reusify')\nvar fib = require('reusify/benchmarks/fib')\nvar instance = reusify(MyObject)\n\n// get an object from the cache,\n// or creates a new one when cache is empty\nvar obj = instance.get()\n\n// set the state\nobj.num = 100\nobj.func()\n\n// reset the state.\n// if the state contains any external object\n// do not use delete operator (it is slow)\n// prefer set them to null\nobj.num = 0\n\n// store an object in the cache\ninstance.release(obj)\n\nfunction MyObject () {\n  // you need to define this property\n  // so V8 can compile MyObject into an\n  // hidden class\n  this.next = null\n  this.num = 0\n\n  var that = this\n\n  // this function is never reallocated,\n  // so it can be optimized by V8\n  this.func = function () {\n    if (null) {\n      // do nothing\n    } else {\n      // calculates fibonacci\n      fib(that.num)\n    }\n  }\n}\n```\n\nThe above example was intended for synchronous code, let's see async:\n```js\nvar reusify = require('reusify')\nvar instance = reusify(MyObject)\n\nfor (var i = 0; i < 100; i++) {\n  getData(i, console.log)\n}\n\nfunction getData (value, cb) {\n  var obj = instance.get()\n\n  obj.value = value\n  obj.cb = cb\n  obj.run()\n}\n\nfunction MyObject () {\n  this.next = null\n  this.value = null\n\n  var that = this\n\n  this.run = function () {\n    asyncOperation(that.value, that.handle)\n  }\n\n  this.handle = function (err, result) {\n    that.cb(err, result)\n    that.value = null\n    that.cb = null\n    instance.release(that)\n  }\n}\n```\n\nAlso note how in the above examples, the code, that consumes an instance of `MyObject`,\nreset the state to initial condition, just before storing it in the cache.\nThat's needed so that every subsequent request for an instance from the cache,\ncould get a clean instance.\n\n## Why\n\nIt is faster because V8 doesn't have to collect all the functions you\ncreate. On a short-lived benchmark, it is as fast as creating the\nnested function, but on a longer time frame it creates less\npressure on the garbage collector.\n\n## Other examples\nIf you want to see some complex example, checkout [middie](https://github.com/fastify/middie) and [steed](https://github.com/mcollina/steed).\n\n## Acknowledgements\n\nThanks to [Trevor Norris](https://github.com/trevnorris) for\ngetting me down the rabbit hole of performance, and thanks to [Mathias\nBuss](http://github.com/mafintosh) for suggesting me to share this\ntrick.\n\n## License\n\nMIT\n\n[npm-badge]: https://badge.fury.io/js/reusify.svg\n[npm-url]: https://badge.fury.io/js/reusify\n","_attachments":{},"homepage":"https://github.com/mcollina/reusify#readme","bugs":{"url":"https://github.com/mcollina/reusify/issues"},"license":"MIT"}