basic memoization in ruby

22
Basic memoization in Ruby Ombu Labs, April 2015

Upload: ombu-labs-the-lean-software-boutique

Post on 29-Jul-2015

63 views

Category:

Software


1 download

TRANSCRIPT

Page 1: Basic memoization in Ruby

Basic memoization in

RubyOmbu Labs, April 2015

Page 2: Basic memoization in Ruby

“Memoization is an optimization technique where

you cache the results of expensive method calls.”

http://nithinbekal.com/posts/ruby-memoization/

Page 3: Basic memoization in Ruby

Conditional assignment operator

a ||= b

Page 4: Basic memoization in Ruby

irb(main):001:0> a = 1=> 1irb(main):002:0> a ||= 2=> 1

Not assigned, because a was already set to 1

irb(main):003:0> a = nil=> nilirb(main):004:0> a ||= 2=> 2

Assigned, because a was nil

Page 5: Basic memoization in Ruby

a ||= b == a || a = b

Page 6: Basic memoization in Ruby

Without memoization

Page 7: Basic memoization in Ruby

def current_user User.find(session[:user_id])end

Page 8: Basic memoization in Ruby
Page 9: Basic memoization in Ruby

With memoization

Page 10: Basic memoization in Ruby

def current_user @current_user ||= User.find(session[:user_id])end

Page 11: Basic memoization in Ruby
Page 12: Basic memoization in Ruby

When to memoize?

Page 13: Basic memoization in Ruby

• Duplicate database calls

• Expensive calculations

• Calculations that do not change

Page 14: Basic memoization in Ruby

When NOT to memoize?

Page 15: Basic memoization in Ruby

• Some methods that take parameters *

• Calculations that can easily change

* unless you memoize a Hash object

Page 16: Basic memoization in Ruby

2.1.2 :001 > def say_hi(name)2.1.2 :002?> @greeting ||= "Hello #{name}!"2.1.2 :003?> end => :say_hi 2.1.2 :004 > say_hi("John") => "Hello John!" 2.1.2 :005 > say_hi("You") => "Hello John!"

Page 17: Basic memoization in Ruby

Real use case

Page 18: Basic memoization in Ruby

CACHE (0.0ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1 [["id", 3]]CACHE (0.1ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1 [["id", 3]]CACHE (0.0ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1 [["id", 3]]CACHE (0.0ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1 [["id", 3]]CACHE (0.0ms) SELECT "groups".* FROM "groups" WHERE "groups"."id" = $1 LIMIT 1 [["id", 3]]… (around 100 calls)

Page 19: Basic memoization in Ruby

By applying the memoization pattern, the cached query count was reduced from around 100 to less than 40

Page 20: Basic memoization in Ruby
Page 21: Basic memoization in Ruby

“Those cache calls mean Rails is returning the cached result of the SQL query, but it doesn’t include the cost of building the

User object.”

“And because Rails hides the cost of object creation these queries cost more than the

0.0ms and 0.1ms reported!”

http://gavinmiller.io/2013/basics-of-ruby-memoization/

Page 22: Basic memoization in Ruby

THANK YOU!

questions?