Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby VM Method Caching

Avatar for Fabio MA Fabio MA
April 19, 2013

Ruby VM Method Caching

Avatar for Fabio MA

Fabio MA

April 19, 2013

More Decks by Fabio MA

Other Decks in Technology

Transcript

  1. •Method  lookup  é  caro  em  OO •O  que  expira  o

     cache  do  MRI tl;dr Friday, April 19, 13
  2. •Method  lookup  é  caro  em  OO •O  que  expira  o

     cache  do  MRI •Object#extend  e  o  desempenho  do  MRI tl;dr Friday, April 19, 13
  3. method  caching class  Foo    def  bar    end end

    1_000_000.times  do    foo  =  Foo.new    foo.bar end Friday, April 19, 13
  4. method  caching class  Foo    def  bar    end end

    1_000_000.times  do    foo  =  Foo.new    foo.bar end callsite Friday, April 19, 13
  5. method  caching class  Foo    def  bar    end end

    1_000_000.times  do    foo  =  Foo.new    foo.bar end callsite Friday, April 19, 13
  6. method  caching class  Foo    def  bar    end end

    1_000_000.times  do    foo  =  Foo.new    foo.bar end callsite callsite Friday, April 19, 13
  7. method  caching class  Foo    def  bar    end end

    1_000_000.times  do    foo  =  Foo.new    foo.bar end callsite callsite Friday, April 19, 13
  8. method  caching class  Foo    def  bar    end end

    1_000_000.times  do    foo  =  Foo.new    foo.bar end callsite callsite cada  chamada  de  método  é  um  novo   callsite Friday, April 19, 13
  9. method  lookup class  Foo    def  bar    end end

    class  Man  <  Foo;  end class  Choo  <  Man;end class  Zoo  <  Choo;end Zoo.new.bar Friday, April 19, 13
  10. method  lookup class  Foo    def  bar    end end

    class  Man  <  Foo;  end class  Choo  <  Man;end class  Zoo  <  Choo;end Zoo.new.bar • method  lookup  é  caro  no  Ruby  (tree  of  hashes  with  methods) Friday, April 19, 13
  11. method  lookup class  Foo    def  bar    end end

    class  Man  <  Foo;  end class  Choo  <  Man;end class  Zoo  <  Choo;end Zoo.new.bar • method  lookup  é  caro  no  Ruby  (tree  of  hashes  with  methods) • a  cada  novo  callsite,  o  Ruby  cacheia  as  instruções  do  método Friday, April 19, 13
  12. method  lookup class  Foo    def  bar    end end

    class  Man  <  Foo;  end class  Choo  <  Man;end class  Zoo  <  Choo;end Zoo.new.bar • method  lookup  é  caro  no  Ruby  (tree  of  hashes  with  methods) • a  cada  novo  callsite,  o  Ruby  cacheia  as  instruções  do  método • inline  caching:  perto  das  instruções  do  callsite Friday, April 19, 13
  13. inline  caching  no  MRI •expiry  global   (ruby_vm_global_state_version) •monomórfico •performance

     depende  do  código  (YMMV) •quebra  o  DCI  (rubydrama):  domain  model   (data),  use  cases  (context),  interacUon Friday, April 19, 13
  14. o  que  expira  o  cache  do  MRI def foo end

    o = Object.new def o.singleton end Friday, April 19, 13
  15. o  que  expira  o  cache  do  MRI def foo end

    o = Object.new def o.singleton end definir  novos  métodos  num  objeto Friday, April 19, 13
  16. o  que  expira  o  cache  do  MRI alias say puts

    Kernel.send :alias_method, :say, :puts Friday, April 19, 13
  17. o  que  expira  o  cache  do  MRI definir/undef  aliases alias

    say puts Kernel.send :alias_method, :say, :puts Friday, April 19, 13
  18. o  que  expira  o  cache  do  MRI definir/undef  aliases alias

    say puts Kernel.send :alias_method, :say, :puts FOO = "bar" Object.const_set :FOO, "bar" Object.send :remove_const, :Kernel Friday, April 19, 13
  19. o  que  expira  o  cache  do  MRI definir/undef  aliases alias

    say puts Kernel.send :alias_method, :say, :puts FOO = "bar" Object.const_set :FOO, "bar" Object.send :remove_const, :Kernel definir/undef  CONSTs Friday, April 19, 13
  20. o  que  expira  o  cache  do  MRI class A #

    definir classe end Friday, April 19, 13
  21. o  que  expira  o  cache  do  MRI class A #

    definir classe end class << "Hello World" # criar singleton end Friday, April 19, 13
  22. o  que  expira  o  cache  do  MRI class A #

    definir classe end module B # definir módulo end class << "Hello World" # criar singleton end Friday, April 19, 13
  23. o  que  expira  o  cache  do  MRI class A #

    definir classe end module B # definir módulo end class Object # reabrir objeto (monkeypatch) end class << "Hello World" # criar singleton end Friday, April 19, 13
  24. o  que  expira  o  cache  do  MRI class A #

    definir classe end module B # definir módulo end class Object # reabrir objeto (monkeypatch) end class << "Hello World" # criar singleton end "Hello World".extend(B) # criar singleton Friday, April 19, 13
  25. o  que  expira  o  cache  do  MRI GC.start # ligar

    o Garbage Collector Friday, April 19, 13
  26. o  que  expira  o  cache  do  MRI GC.start # ligar

    o Garbage Collector OpenStruct.new(a: 1, b: 2) # openstructs Friday, April 19, 13
  27. object#extend •todo  objeto  no  Ruby  tem  sua  eigenclass •“eigen”  -­‐

     “o  meu  puro  eu”  em  alemão Friday, April 19, 13
  28. object#extend •todo  objeto  no  Ruby  tem  sua  eigenclass •“eigen”  -­‐

     “o  meu  puro  eu”  em  alemão •o  Ruby  cria  eigenclasses  em  lazy  mode Friday, April 19, 13
  29. object#extend •todo  objeto  no  Ruby  tem  sua  eigenclass •“eigen”  -­‐

     “o  meu  puro  eu”  em  alemão •o  Ruby  cria  eigenclasses  em  lazy  mode •cada  vez  que  um  objeto  ganha  um  método   diferente  da  sua  classe,  sua  eigenclass  é   criada Friday, April 19, 13
  30. object#extend •todo  objeto  no  Ruby  tem  sua  eigenclass •“eigen”  -­‐

     “o  meu  puro  eu”  em  alemão •o  Ruby  cria  eigenclasses  em  lazy  mode •cada  vez  que  um  objeto  ganha  um  método   diferente  da  sua  classe,  sua  eigenclass  é   criada •classes  são  sua  própria  eigenclass Friday, April 19, 13
  31. object#extend class  Dog    def  bark!        puts

     “woof”    end end arlindo  =  Dog.new def  arlindo.weird_bark!    puts  “woofaaafz” end normal_dog  =  Dog.new normal_dog  >  Dog  >  Object  >  BasicObject arlindo  >  eigenclass  >  Dog  >  Object  >  BasicObject       Friday, April 19, 13
  32. object#extend normal_dog.class  >  Dog       arlindo.class  >  Dog

          o  Ruby  esconde  a  eigenclass  e  só  muda  o   ponteiro  da  “klass”  para  a  nova  classe Friday, April 19, 13
  33. object#extend •Ruby  tem  instruções  oUmizadas  para   alguns  métodos:  +,

     -­‐,  [],  []=,  size,  empty?   Friday, April 19, 13
  34. object#extend •Ruby  tem  instruções  oUmizadas  para   alguns  métodos:  +,

     -­‐,  [],  []=,  size,  empty?   •Array,  Hashes,  operações  básicas Friday, April 19, 13
  35. object#extend •Ruby  tem  instruções  oUmizadas  para   alguns  métodos:  +,

     -­‐,  [],  []=,  size,  empty?   •Array,  Hashes,  operações  básicas •Se  existe  uma  eigenclass,  o  Ruby  usa  as   instruções  não  oUmizadas  (até  100%  mais   lento,  YMMV) Friday, April 19, 13