reduce object allocations

Example:

x = [1,2,3,4]
y = [3,2,1]

def test x, y
  hash = {}
  x.zip(y) { |k,v| hash[k] = v }
  hash
end

def test2 x, y
  Hash[x.zip(y)]
end

def test3 x, y
  x.zip(y).each_with_object({}) { |(k,v),hash| hash[k] = v }
end

def stat num
  start = GC.stat(:total_allocated_object)
  num.times { yield }
  total_obj_count = GC.stat(:total_allocated_object) - start
  puts "#{total_obj_count / num} allocations per call"
end

stat(100) { test(x,y) }
stat(100) { test2(x,y) }
stat(100) { test3(x,y) }

__END__
2 allocations per call
7 allocations per call
8 allocations per call
This commit is contained in:
Aaron Patterson 2014-05-21 14:06:58 -07:00
parent da83a6f126
commit 931ee4186b

@ -184,7 +184,7 @@ def call(t, args)
private
def optimized_helper(args)
params = Hash[parameterize_args(args)]
params = parameterize_args(args)
missing_keys = missing_keys(params)
unless missing_keys.empty?
@ -203,7 +203,9 @@ def optimize_routes_generation?(t)
end
def parameterize_args(args)
@required_parts.zip(args.map(&:to_param))
params = {}
@required_parts.zip(args.map(&:to_param)) { |k,v| params[k] = v }
params
end
def missing_keys(args)