Scrym: Self-collecting Ruby Mutators
A explicit Ruby's memory management system on programmer-controlled time without malloc/free way.
Usage
Usually Ruby's garbage collector manages all object on the heap.
However, if you use Scrym::Mutator.mark(obj)
, GC doesn't care obj
at all time.
Instead, we explicitly collect those on a mutator at one's own risk.
require "scrym"
include Scrym
a = "a"
10_000.times do |i|
a = a.succ
Mutator.mark(a)
Mutator.collect if (i % 10).zero?
end
p a #=> "ntq"
Scrym collector's targets are only marked objects by Scrym.
Improvement of performance
% time ruby benchmark/bm_app_mandelbrot.rb
GC.count = 1785 : total time 0.7400470000000003(sec)
2.14s user 0.04s system 99% cpu 2.185 total
% time ruby benchmark/bm_app_mandelbrot_with_scrym.rb
GC.count = 1092 : total time 0.40402999999999956(sec)
1.92s user 0.04s system 99% cpu 1.963 total
Installation
Add this line to your application's Gemfile:
gem 'scrym'
And then execute:
$ bundle
Or install it yourself as:
$ gem install scrym
Supported
- Ruby 1.9.3 or later
Not supported
- Finalizer (All programmers should not use any finalizer)
Acknowledgment
This product's idea is based on Self-collecting Mutators. Thanks a lot!
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Added some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request