DDMemoize
DDMemoize adds support for memoizing Ruby functions.
For example, the following Fibonacci implementation runs quickly (in O(n) rather than in O(2^n)):
class FibFast
DDMemoize.activate(self)
memoized def run(n)
if n == 0
0
elsif n == 1
1
else
run(n - 1) + run(n - 2)
end
end
end
Features:
- Supports memoizing functions on frozen objects
- Releases memoized values when needed in order to reduce memory pressure
- Optionally records metrics
Installation
Add this line to your application's Gemfile:
gem 'ddmemoize'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ddmemoize
Usage
First, require ddmemoize
and enable it using DDMemoize.activate
:
require 'ddmemoize'
class FibFast
DDMemoize.activate(self)
# …
end
To memoize a function, call memoize
with the name of the function:
def run(n)
# …
end
memoize :run
Alternatively, prepend memoized
to the function definition:
memoized def run(n)
# …
end
Do not memoize functions that depend on mutable state.
Metrics
To activate metrics, call DDMemoize.enable_metrics
after requiring ddmemoize
.
To print the collected metrics, call DDMemoize.print_metrics
:
DDMemoize.print_metrics
memoization │ hit miss %
────────────┼───────────────────
FibFast#fib │ 998 1001 49.9%
Development
Install dependencies:
$ bundle
Run tests:
$ bundle exec rake
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/ddfreyne/ddmemoize. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
License
The gem is available as open source under the terms of the MIT License.
Code of Conduct
Everyone interacting in the DDMemoize project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the code of conduct.