EfficientJoin
Very fast and memory-efficient way to join ruby lists of numbers and strings.
Joins are performed with a constant number of ruby object allocations,
compared to Array#join, PG:TextEncoder::Array.new.encode, etc, where at least n object
allocations are required to join an array of n items.
For tests with array sizes of 1 million entries, here are some measured memory usage and execution time improvements:
| EfficientJoin function | Equivalent ruby function | Memory usage | Time |
|---|---|---|---|
| join | Array#join | 30% | 7.0x faster |
| join_pg_array | PG::TextEncoder::Array.new.encode | 18% | 7.4x faster |
Installation
Add this line to your application's Gemfile:
gem 'efficient_join'And then execute:
$ bundle
Or install it yourself as:
$ gem install efficient_join
Usage
With ruby #join:
MemoryProfiler.report { (0...1000000).to_a.join(',') }
...
@total_allocated=1000003,
@total_allocated_memsize=62636393,
With efficient join:
require 'efficient_join'
EfficientJoin.join((0...1000000).to_a)
...
@total_allocated=5,
@total_allocated_memsize=18525362
It can also take separator, item prefix and item suffix:
EfficientJoin.join([1,2,3,4], separator: ',', item_prefix: '(', item_suffix: ',now(),now())')
=> "(1,now(),now()),(2,now(),now()),(3,now(),now()),(4,now(),now())"
And has a variant for efficiently building postgres arrays (which is far more
efficient than PG::TextEncoder::Array.new.encode:
EfficientJoin.join_pg_array([1,2,3,4])
=> "{1,2,3,4}"
Which is equivalent to:
EfficientJoin.join([1,2,3,4], header: '{', footer: '}')
=> "{1,2,3,4}"
Development
After checking out the repo, run bin/setup to install dependencies. You can also run bin/console for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/tomm/efficient_join.
License
The gem is available as open source under the terms of the MIT License.