Skip to content

Instantly share code, notes, and snippets.

View dbenhur's full-sized avatar

Devin Ben-Hur dbenhur

View GitHub Profile
def transform_hash(original, options={}, &block)
options[:safe_descent] ||= {}
new_hash = {}
options[:safe_descent][original.object_id] = new_hash
original.inject(new_hash) { |result, (key,value)|
if (options[:deep] && Hash === value)
value = options[:safe_descent].fetch( value.object_id ) {
transform_hash(value, options, &block)
}
end
@dbenhur
dbenhur / set-cardinality-bm.rb
Created June 14, 2013 22:57
Show at what set size inclusion tests are faster for sets vs arrays.
#!/usr/bin/env ruby
require 'benchmark'
require 'set'
N = 5_000_000
MAX_CARD = 5
ARRAYS = (0..MAX_CARD).map {|i| (1..i).to_a}
@dbenhur
dbenhur / to_proc.bm.rb
Created June 5, 2013 17:00
Simple Micro-Benchmark to show Symbol#to_proc performance hit
#!/usr/bin/env ruby
require 'benchmark'
N = 1_000_000
A = (0..10).to_a
def map_plain
A.map {|e| e.to_s}
#!/usr/bin/env ruby
require 'set'
require 'benchmark'
N = 5
HSZ = 150_000
ASZ = 25_000
#!/usr/bin/env ruby
require 'benchmark'
# 456976 four character words
STR = ('aaaa'..'zzzz').to_a * ' '
N = 10
puts RUBY_DESCRIPTION
puts "#{N} times on string of size #{STR.size}"
@dbenhur
dbenhur / yield-vs-block.rb
Last active December 14, 2015 00:58
micro-benchmark comparing various ways to capture and forward a block
#!/usr/bin/env ruby
require 'benchmark'
require 'forwardable'
puts RUBY_DESCRIPTION
class TestMe
extend Forwardable
def_delegators :@arr, :each
#!/usr/bin/env ruby
require 'benchmark'
require 'set'
N = 10_000_000
Benchmark.bm do |x|
1.upto(10) do |i|
a = (0...i).to_a
@dbenhur
dbenhur / so13002594-bm.rb
Created October 22, 2012 02:46
SO #13002594 Handling array of hashes
#!/usr/bin/env ruby
# Benchmark answers to http://stackoverflow.com/questions/13002594/handling-array-of-hashes
require 'benchmark'
A = [{"lib1"=>"30"}, {"lib2"=>"30"}, {"lib9"=>"31"}, {"lib2"=>"31"}, {"lib3"=>"31"}, {"lib1"=>"32"}, {"l\
ib2"=>"32"}, {"lib1"=>"33"}, {"lib3"=>"36"}, {"lib2"=>"36"}, {"lib1"=>"37"}]
def to_a_flat
A.map(&:to_a).flatten(1).each_with_object({}) do |(k, v), h|
@dbenhur
dbenhur / subset_bm.rb
Created July 5, 2012 22:19
StackOverflow - Ruby - Optimize the comparison of two arrays with duplicates
#!/usr/bin/env ruby
# benchmarks for http://stackoverflow.com/questions/11349544/ruby-optimize-the-comparison-of-two-arrays-with-duplicates/11352055#comment14951595_11352055
require 'rubygems'
require 'multiset'
require 'benchmark'
small_b = "cheddaar".split(//)
small_a = "cheddar".split(//)
@dbenhur
dbenhur / thread_safe_expectation_spec.rb
Created April 12, 2012 00:41
RSpec #should_recieve can't count correctly with threads
require 'rspec'
T = 10000
N = 200
class ConcurrentSender
def initialize(collaborator,message,threads,sends)
@collaborator,@message,@threads,@sends = collaborator,message,threads,sends
@tasks = []
end