Slide 1

Slide 1 text

Rails ΞϓϦέʔγϣϯͷύϑΥʔϚϯεվળख๏ @k0kubun / ͗Μ͟Rubyձٞ 01

Slide 2

Slide 2 text

ࣗݾ঺հ ➤ GitHub, Twitter: @k0kubun ➤ ৽ถRubyίϛολʔ ➤ Ruby 2.5ͰERBΛੈք࠷଎ͷerb࣮૷ʹͨͧ͠ ➤ ࠷ۙ࡞ͬͨ΋ͷ ➤ LLVMϕʔεͷRubyͷJITίϯύΠϥ LLRB ➤ TreasureDataॴଐ ➤ ෼ࢄDBͷεΩʔϚ΍δϣϒͷ؅ཧΛ΍ΔRailsΞϓϦͷ։ൃ ➤ ↑ΛҰॹʹ΍ͬͯ͘ΕΔਓΛੵۃ࠾༻த!!

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ ➤͍ͭͲͷΑ͏ʹܭଌΛ͢΂͖͔ ➤֤छܭଌํ๏ͱͦͷڧΈɺݶք ➤ϨϏϡʔͰݟͨඇޮ཰ͳίʔυ ➤࠷ۙͷ࣮ࡍͷߴ଎Խࣄྫ

Slide 5

Slide 5 text

͍ͭͲͷΑ͏ʹ ܭଌΛ͢΂͖͔

Slide 6

Slide 6 text

͜Μͳܦݧ͸͋Γ·ͤΜ͔

Slide 7

Slide 7 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠!

Slide 8

Slide 8 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋ ͑ͣincludesͨ͠!

Slide 9

Slide 9 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋ ͑ͣincludesͨ͠! ➤ ಛʹܭଌͯ͠ͳ͍͚ͲͳΜ͔଎͘ͳΔΒ͍͔͠ΒσϓϩΠ͠ ·͢!

Slide 10

Slide 10 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ1: ܭଌΛ͍ͯ͠ͳ͍ ➤ ͳΜ͔N+1ΫΤϦ(?)ౕͬͯΛeager loading(?)͢Δͱ଎͘ͳΔ Β͍͠! ➤ ϧʔϓͷதͰhas_many association͕ࢀর͞ΕͯΔ͔ΒͱΓ͋ ͑ͣincludesͨ͠! ➤ ಛʹܭଌͯ͠ͳ͍͚ͲͳΜ͔଎͘ͳΔΒ͍͔͠ΒσϓϩΠ͠ ·͢! ➤ σϓϩΠޙNewRelicΛݟͯΈͨΒ஗͘ͳͬͯͨ… ※2014೥͘Β͍ͷ๻ͷ࿩ɻhas_manyͩͱಉ࣌ʹϝϞϦΛ͔ͳΓফඅ͢Δ͜ͱʹͳΓɺྫ͑͹εϫοϓͨ͠Γ͢Δͱ஗͘ͳΔ

Slide 11

Slide 11 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏!

Slide 12

Slide 12 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏! ➤ LIMIT OFFSETΑΓɺORDER BYͯ͠ಛఆͷ஋ͰϑΟϧλʔ͠ ͯϨίʔυΛऔͬͯ͘Δํ͕଎͍Β͍͠! ͪΐͬͱΫΤϦ౤͛ ͯΈͨΒ͔֬ʹ଎͔ͬͨ!

Slide 13

Slide 13 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏! ➤ LIMIT OFFSETΑΓɺORDER BYͯ͠ಛఆͷ஋ͰϑΟϧλʔ͠ ͯϨίʔυΛऔͬͯ͘Δํ͕଎͍Β͍͠! ͪΐͬͱΫΤϦ౤͛ ͯΈͨΒ͔֬ʹ଎͔ͬͨ! ➤ ιʔτʹ࢖ΘΕΔΩʔ͕ͨ͘͞Μ͋ͬͯ؆୯ʹ͸ΫΤϦΛ࡞ Εͳ͍ͷͰɺ͕Μ͹ͬͯͦΕ͕Ͱ͖ΔϥΠϒϥϦΛ࡞ͬͨ!

Slide 14

Slide 14 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ2: ܭଌ࣌ͷߟྀ࿙Ε ➤ ͜ͷAPIɺԿͰ஗͍ͷ͔Α͘Θ͔Βͳ͍͚Ͳɺϖʔδωʔγϣ ϯΛͯ͠ͳ͍ͷ͸໰୊͋Γͦ͏! ➤ LIMIT OFFSETΑΓɺORDER BYͯ͠ಛఆͷ஋ͰϑΟϧλʔͯ͠ ϨίʔυΛऔͬͯ͘Δํ͕଎͍Β͍͠! ͪΐͬͱΫΤϦ౤͛ͯ ΈͨΒ͔֬ʹ଎͔ͬͨ! ➤ ιʔτʹ࢖ΘΕΔΩʔ͕ͨ͘͞Μ͋ͬͯ؆୯ʹ͸ΫΤϦΛ࡞Ε ͳ͍ͷͰɺ͕Μ͹ͬͯͦΕ͕Ͱ͖ΔϥΠϒϥϦΛ࡞ͬͨ! ➤ ޙ͔Βܭଌ͠௚ͨ͠Βશવҧ͏݁ՌͰɺLIMIT OFFSETͰ΋଎͘ ͳΔ͠΋͏গ͠γϯϓϧʹ࣮૷Ͱ͖ͨ… ※͜Ε͸๻ࣗ਎͕΍ͬͨΘ͚͡Όͳ͍͚Ͳɺݟ͍ͯͨ

Slide 15

Slide 15 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏!

Slide 16

Slide 16 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ!

Slide 17

Slide 17 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ!

Slide 18

Slide 18 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ! ➤ ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏!

Slide 19

Slide 19 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ! ➤ ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏! ➤ ϓϩϑΝΠϦϯάͯ͠΋ͳ͔ͳ͔ݪҼ͕Θ͔Βͳ͍…͍ͭͷ ·ʹ͔1೔ܦͬͯͨ…

Slide 20

Slide 20 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ3: ܭଌͷ΍Γ͗͢ ➤ ͳΜ͔͜ͷAPIΊͬͪΌ஗͍͔ΒͳΜͰ஗͍ͷ͔ܭଌ͠Α͏! ➤ ൒೔͔͚ͯܭଌͯ͠मਖ਼ˠ଎͘ͳͬͨ! ➤ લճͷܭଌ݁ՌΛݟͯ·ͨमਖ਼ˠ଎͘ͳͬͨ! ➤ ܭଌ͸ਆ! ϘτϧωοΫ͕Ҡ͔ͬͨΒ·ͨܭଌ͠Α͏! ➤ ϓϩϑΝΠϦϯάͯ͠΋ͳ͔ͳ͔ݪҼ͕Θ͔Βͳ͍…͍ͭͷ·ʹ ͔1೔ܦͬͯͨ… ➤ ͍ͭͷ·ʹ͔ଞͷਓ͕ɺܭଌΛ͠ͳͯ͘΋ࢥ͍ͭ͘Α͏ͳɺ໌͔ ʹޮՌ͕͋Γͦ͏ͳύονΛग़͍ͯͨ͠ͷͰ΍Δඞཁ͕ͳ͘ͳͬ ͨ…

Slide 21

Slide 21 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ4: ϛεϦʔσΟϯάͳܭଌ݁Ռ ➤ NewRelicΛݟͯͨΒɺϘτϧωοΫ͕jbuilderͩͬͨ!

Slide 22

Slide 22 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ4: ϛεϦʔσΟϯάͳܭଌ݁Ռ ➤ NewRelicΛݟͯͨΒɺϘτϧωοΫ͕jbuilderͩͬͨ! ➤ ߴ଎ͳJSONͷςϯϓϨʔτΤϯδϯ࡞Δͧ!!!

Slide 23

Slide 23 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ4: ϛεϦʔσΟϯάͳܭଌ݁Ռ ➤ NewRelicΛݟͯͨΒɺϘτϧωοΫ͕jbuilderͩͬͨ! ➤ ߴ଎ͳJSONͷςϯϓϨʔτΤϯδϯ࡞Δͧ!!! ➤ Ͱ΋stackprofͰݟͯΈͨΒશવҧ͏ͱ͜ΖͰ࣌ؒ࢖ͬͯͨ…

Slide 24

Slide 24 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ5: ܭଌΛ͕ͨ͠௚͠Α͏͕ͳ͍ ➤ ͳΜ͔ύϑΥʔϚϯεվળΛ͢ΔͳΒstackprofౕͬͯͰܭଌ Λͨ͠ํ͕͍͍Β͍͠!

Slide 25

Slide 25 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ5: ܭଌΛ͕ͨ͠௚͠Α͏͕ͳ͍ ➤ ͳΜ͔ύϑΥʔϚϯεվળΛ͢ΔͳΒstackprofౕͬͯͰܭଌ Λͨ͠ํ͕͍͍Β͍͠! ➤ ͱΓ͋͑ͣܭଌͯ͠Έͨ!

Slide 26

Slide 26 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ5: ܭଌΛ͕ͨ͠௚͠Α͏͕ͳ͍ ➤ ͳΜ͔ύϑΥʔϚϯεվળΛ͢ΔͳΒstackprofౕͬͯͰܭଌ Λͨ͠ํ͕͍͍Β͍͠! ➤ ͱΓ͋͑ͣܭଌͯ͠Έͨ! ➤ Կ͔஗͍ͱ͜Ζ͕Rails಺෦ʹूதͯͯ͠ɺRailsΑ͘Θ͔Βͳ ͍͔Β௚ͤͳ͍… ※௚ͯ͘͠Ε

Slide 27

Slide 27 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏!

Slide 28

Slide 28 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ ͍ͯΔΤϯυϙΠϯτΛݟ͚͔ͭͨΒ͕Μ͹ͬͯݪҼΛௐ΂ ͨ! ஗͍ݪҼ΋Θ͔ͬͨ!

Slide 29

Slide 29 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ ͍ͯΔΤϯυϙΠϯτΛݟ͚͔ͭͨΒ͕Μ͹ͬͯݪҼΛௐ΂ ͨ! ஗͍ݪҼ΋Θ͔ͬͨ! ➤ શମͰ͸ϘτϧωοΫʹͳͬͯͳ͍APIʹ͍͢͝஗ౕ͍͕͋ͬ ͯɺ࣮ࡍʹ͸ͦͬͪͷํ͕༏ઌ౓͕ߴ͔ͬͨ…

Slide 30

Slide 30 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ6: ෆཁͳ࠷దԽΛ͍ͯ͠Δ ➤ ύϑΥʔϚϯεΛվળͨ͠Βαʔόʔ୅͕ݮΒͤͦ͏͔ͩΒ ଎͘͠Α͏! ➤ NewRelicͰMost Time ConsumingΛݟͯϘτϧωοΫʹͳͬ ͍ͯΔΤϯυϙΠϯτΛݟ͚͔ͭͨΒ͕Μ͹ͬͯݪҼΛௐ΂ ͨ! ஗͍ݪҼ΋Θ͔ͬͨ! ➤ શମͰ͸ϘτϧωοΫʹͳͬͯͳ͍APIʹ͍͢͝஗ౕ͍͕͋ͬ ͯɺ࣮ࡍʹ͸ͦͬͪͷํ͕༏ઌ౓͕ߴ͔ͬͨ… ➤ ͦΜͳ͜ͱΛ΍͍ͬͯͨΒ͓٬༷͕཭Εͯ͠·͍શମͷརӹ ͸ݮͬͯ͠·ͬͨ… ※ͱ͍͏Α͏ͳ͜ͱΛ૝ఆͯ͠ߦಈ͍ͯ͠ΔͷͰձࣾ͸όϦόϦ੒௕͍ͯ͠·͢

Slide 31

Slide 31 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠!

Slide 32

Slide 32 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ!

Slide 33

Slide 33 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ! ➤ งғؾͰLLVMΛ΍ͬͯ3ϱ݄͔͚࣮ͯ૷ͨ͠!

Slide 34

Slide 34 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ! ➤ งғؾͰLLVMΛ΍ͬͯ3ϱ݄͔͚࣮ͯ૷ͨ͠! ➤ ϕϯνϚʔΫʹΑͬͯ͸଎͘ͳΔ͚Ͳɺ໨తͷΞϓϦͰ͸ͦ ΜͳޮՌͳ͔ͬͨ…

Slide 35

Slide 35 text

ύϑΥʔϚϯεվળ ࣦഊύλʔϯ7: ॳ৺ऀ͕งғؾͰ΍͍ͬͯΔ ➤ Α͘Θ͔Βͳ͍͚ͲͳΜ͔଎͍ͨ͘͠! ➤ ͳΜ͔LLVM(?)ͰJIT(?)ౕͬͯͰΠϯϥΠϯԽ(?)Λ΍Δͱ଎͘ ͳΔ(?)ͬͯҒ͍ਓ͕͍ͬͯͨ! ➤ งғؾͰLLVMΛ΍ͬͯ3ϱ݄͔͚࣮ͯ૷ͨ͠! ➤ ϕϯνϚʔΫʹΑͬͯ͸଎͘ͳΔ͚Ͳɺ໨తͷΞϓϦͰ͸ͦ ΜͳޮՌͳ͔ͬͨ… ➤ ͔͠΋LLVM͸Πϯετʔϧͪ͠ΌͩΊͬͯݴΘΕ͔ͨΒͲͬ ͪʹ͠Ζ࢖͑ͳ͔ͬͨ… ※ຊؾͰͦ͏ࢥ͍ͬͯͨΘ͚Ͱ͸ͳ͘δϣʔΫ͚ͩͲɺྫͱͯ͠͸͋Γ͏Δౕ

Slide 36

Slide 36 text

Ͳ͏͢Ε͹͜ͷΑ͏ͳ ࣦഊΛ͠ͳͯ͘͢Ή͔?

Slide 37

Slide 37 text

ύϑΥʔϚϯεվળʹࣦഊ͢ΔݪҼ ➤ ܭଌ݁Ռͷଥ౰ੑͷݕূ͕؁͘ɺޡͬͨܭଌΛͯ͠͠·͏ ➤ ݱ࣮͸ෳࡶͳͷͰɺਖ਼͘͠ܭଌ͢Δ͜ͱ͸ͦ΋ͦ΋ͱͯ΋೉ ͍͠ ➤ ೉͍͠ͷͰɺܭଌ͠ͳͯ͘͢ΉͳΒͦΕʹӽͨ͜͠ͱ͸ͳ͍ ➤ ෆཁͳ΋ͷΛܭଌ͠ɺ༨ܭͳ͜ͱʹ࣌ؒΛ࢖ͬͯ͠·͏ ➤ ࢓ࣄͰ΍͍ͬͯΕ͹ɺ࣌ؒΛ͔͚Δͱ͓ۚ΋͔͔Δ (झຯ͸ ޚࣗ༝ʹ) ➤ ԿͰ΋ܭଌ͢Ε͹͍͍Θ͚Ͱ͸ͳ͘ɺ༨ܭͳܭଌ͸΍Δ΂͖ Ͱͳ͍

Slide 38

Slide 38 text

Ͱ͸Ͳ͏͢Ε͹ྑ͍͔ ➤ 1. ࠷ॳ͸ͱʹ͔͘ಋೖָ͕ͳ؂ࢹπʔϧ͚ͩΛ͍Εͯܭଌ͢Δ ➤ 2. Ͳ͏ॻ͘ͱ଎͍͔Λ஌͓͖ͬͯɺҰൃͰ଎͍ίʔυΛॻ͖ɺͦͷ؂ࢹπʔϧ ͰͪΌΜͱ֬ೝ͢Δ ➤ ෆ҆ʹͳͬͨ࣌͸͜·ΊʹϕϯνϚʔΫͰͲͪΒ͕଎͍͔ൺֱ͢Δ ➤ 3. ຊ౰ʹ௚͞ͳ͍ͱࠔΔ΄Ͳ஗͍໰୊͕ൃ֮ͨ࣌͠ʹݶΓɺͦΕΛஸೡʹ௚͢ ➤ ௚͢બ୒ࢶ͕ͦ΋ͦ΋গͳ͍࣌͸ɺαοͱશ෦ࢼͯ͠͠·͏ ➤ Ͳ͜Λ௚ͤ͹͍͍͔શ͘Θ͔Βͳ͍࣌ɺԿނ஗͍ͷ͔Λಛఆ͢Δͷ͸ຊ౰ʹ ೉͍͠ͷͰɺ༷ʑͳܭଌํ๏ͷಛੑΛਂ͘஌Γɺ໰୊ͷमਖ਼ʹඞཁͳ࠷௿ݶ ͔ͭద੾ͳܭଌखஈΛऔΔ ➤ ௚͢΂͖৔ॴ͕Θ͔ͬͨޙɺͲ͏௚ͤΔ͔͸օ͞Μ࣍ୈ͚ͩͲɺࣄલʹ ݪҼ͕Θ͔͍ͬͯΕ͹ख໭Γ͸࠷খݶʹͳΔ

Slide 39

Slide 39 text

͜ͷൃදͰಘΒΕΔ͜ͱ ➤ Ͳ͏͢ΔͱָʹܭଌͰ͖Δͷ͔ ➤ RailsΞϓϦͰҰൃͰ଎͍ίʔυΛॻͨ͘Ίͷ஌ݟ ➤ ޙʹ௚͢બ୒ࢶΛߜΔ͜ͱʹ΋ܨ͕Δ ➤ ͦΕͧΕͷܭଌํ๏ͷਖ਼͍͠ཧղɺ࢖͏΂͖Ͱͳ͍έʔε

Slide 40

Slide 40 text

֤छܭଌํ๏ͱ ͦͷڧΈɺݶք

Slide 41

Slide 41 text

ϓϩϑΝΠϥ

Slide 42

Slide 42 text

rblineprof ➤ @tmm1 ੡ɺRubyKaigi 2014 KeynoteͰൃද͞Εͨ ➤ ߦ͝ͱʹͲͷ͘Β͍ͷ͕͔͔͍࣌ؒͬͯΔ͔ग़Δ ৭͕͍ͭͯΔͷ͸rack-lineprofͷػೳͰɺ͜Ε͸ͦΕΛrackͷ֎͔Β΋࢖͑ΔΑ͏ʹͨ͠lineprof.gemͷग़ྗ

Slide 43

Slide 43 text

rblineprof rblineprofͷ࢓૊Έ ➤ Ruby͕1ߦධՁ͢Δ͝ͱʹ࣌ؒΛه࿥ͯ͠…͍ΔΘ͚Ͱ͸ ͳ͍ ➤ RubyͰ࣮૷͞Εͨϝιουͷݺͼग़͠ɾreturnɺCͰ࣮૷ ͞Εͨϝιουͷݺͼग़͠ɾreturn ͷΠϕϯτΛϑοΫ ➤ ͋Δϝιουͷݺͼग़͠ʹͲͷ͘Β͍͕͔͔͔࣌ؒͬͨ Θ͔ΔͷͰɺͦΕΛݺͼग़͠ଆʹද͍ࣔͯ͠Δ

Slide 44

Slide 44 text

rblineprof ϝϦοτɾڧΈ ➤ Ruby͔CͰఆٛ͞Εͨϝιουͷݺͼग़͠Ͱಈ͍͍ͯΔϓ ϩάϥϜ͸͓͓ΉͶ͍͍ײ͡ʹܭଌͰ͖Δ ➤ ࡞ऀஊ: This profiler is great for improving performance of rails templates and controllers. ➤ ग़ྗ͕ms୯ҐͷͨΊ௚ײతͰɺݟΔͷָ͕ ➤ ͱͯ΋ॏཁɺܭଌ݁ՌΛݟΔͷ͕େมͩͱ͕࣌ؒແବʹ ➤ ISUCONͱ͔ʹ࢖͏ͷ͸Αͦ͞͏

Slide 45

Slide 45 text

rblineprof σϝϦοτɾݶք ➤ શͯͷϝιουݺͼग़͕͠ϑοΫ͞ΕΔͷͰɺίʔϧε λοΫͷਂ͍ͱ͜Ζͩͱܭଌର৅ʹେ͖ͳΦʔόʔϔου ͕͔͔ΔͷͰɺຊདྷΑΓ஗͍݁ՌʹͳΔ ➤ ݁ՌΛ৴༻Ͱ͖ͳ͍ͷͰɺܭଌํ๏ͱͯ͠ے͕ྑ͘ͳ͍ ➤ ϝιουݺͼग़͠Ͱ͸ͳ͍෼͸ܭଌ͞Εͳ͍ ➤ YARV͕ opt_* ܥͷ໋ྩͰEXEC_EVENT_HOOKΛݺ͹ͳ ͍ͨΊ ➤ ๻͔͠ࠔΒͳ͍ͱࢥ͏͚ͲɺςϯϓϨʔτΤϯδϯͷܭ ଌʹ࢖͏ʹ͸ඍົʹͳΔ

Slide 46

Slide 46 text

rblineprof < < ΋ ɺ - “ ” ΋ ɺ . e m p t y ? ΋ ϝ ι ο υ ݺ ͼ ग़ ͠Ͱ ͸ ͳ ͍ ( ޙ ड़ ) ͷ Ͱ ܭ ଌ ͞ Ε ͳ ͍ -“” ͕ϝιουݺͼग़͠Ͱ͸ͳ͘ͳΔͷ͸Ruby 2.5͔ΒͰ͕͢ɺ͝ཡͷ௨Γ(?)͜Ε͸Ruby 2.5ͷERBͷੜ੒ίʔυͰ͢ ͜ Ε ΋ . t o _ s ͩ ͚ ͕ ϝ ι ο υ ݺ ͼ ग़ ͠ ( # [ ] ͱ < < ͕ ҧ ͏ ) ͳ ͷ Ͱɺ ͜ ͷ ߦ ʹ ͔ ͔ Δ ࣌ ؒ ͕ 5 . 3 m s ͱ ͸ ݶ Β ͳ ͍

Slide 47

Slide 47 text

stackprof ➤ ͜Ε΋@tmm1 ੡ɺRubyKaigi 2014 KeynoteͰൃද͞Εͨ ➤ rblineprofͷޙܧతѻ͍(?)ͷαϯϓϦϯάϓϩϑΝΠϥ

Slide 48

Slide 48 text

stackprof stackprofͷ࢓૊Έ ➤ setitimer(2) ͰҰఆͷCPU࣌ؒ or ࣮͓͖࣌ؒʹSIGPROF ➤ sigaction(2) ͰγάφϧϋϯυϥΛηοτ͠ɺͦ͜Ͱ rb_postponed_job_register_one ΛݺͼαϯϓϦϯάΛ༧໿ ➤ Ruby 2.1Ͱ௥Ճ͞Εͨ͜ͷAPI͸ɺVMͷঢ়ଶʹҰ؏ੑͷ͋Δ λΠϛϯάͰ౉͞Εͨؔ਺ϙΠϯλ(͜͜Ͱ͸αϯϓϦϯά) Λݺͼग़͢ LLRBͰ͜ͷ࣮૷ΛؙύΫϦͨ͠ͷͰνϣοτϫΧϧ

Slide 49

Slide 49 text

stackprof ϝϦοτɾڧΈ ➤ αϯϓϦϯάͳͷͰɺΦʔόʔϔου͕গͳ͍ ➤ rblineprofʹൺ΂ɺΑΓݱ࣮ʹଈͨ͠ܭଌ݁ՌʹͳΔ ➤ αϯϓϦϯάͷස౓Λࣗ෼ͰίϯτϩʔϧͰ͖ɺεέʔϧ ͢Δ ➤ ελοΫશମͰͷׂ߹͚ͩͰͳ͋͘ΔϝιουͰߦ͝ͱʹ ͔͔͍ͬͯΔ࣌ؒͷׂ߹΋ग़ͤɺ·༷ͨʑͳํ๏Ͱͷ visualizationΛαϙʔτ͍ͯ͠Δ

Slide 50

Slide 50 text

stackprof σϝϦοτɾݶք ➤ αϯϓϦϯάͷύϥϝʔλΛࣗ෼ͰνϡʔχϯάΛ͠ͳ͍ ͱ͍͚ͳ͍ͷͰɺܭଌʹख͕͔͔ؒΔ ➤ αϯϓϦϯά͞ΕΔλΠϛϯά΋౰વϥϯμϜͳͷͰɺͦ ͏͍͏ҙຯͰ͸1ճͷܭଌͷ৴པੑ͸௿͍ ➤ αϯϓϦϯάͷ౎߹ɺܭଌ݁Ռ͕࣌ؒͰ͸ͳׂ͘߹ʹͳΔ ͷͰɺrblineprofʹൺ΂ͯग़ྗ͕एׯ௚ײతͰ͸ͳ͘ͳΔ ➤ CͰ࣮૷͞Εͨ(iseq͕ͳ͍)ϝιου͸શ͘ߟྀ͞Εͳ͍

Slide 51

Slide 51 text

NewRelic NewRelicͷ࢓૊Έ ➤ gem͝ͱʹIntegration͕༻ҙ͞Ε͍ͯͯɺܭଌ͢΂͖ϝ ιου͝ͱʹϞϯΩʔύονͯ͠ϑοΫ ➤ NewRelic༻ͷεϨου͕1෼͓͖ʹϝτϦΫεΛૹ৴

Slide 52

Slide 52 text

NewRelic NewRelicͷ࢓૊Έ

Slide 53

Slide 53 text

NewRelic ϝϦοτɾڧΈ ➤ ඞཁͳͱ͜Ζ͚ͩܭଌͷϑοΫ͕ೖΔͷͰɺܭଌʹΑΔ Φʔόʔϔου͕খ͞Ί ➤ ਓ͕ؒ஌Γ͍ͨϝτϦΫε͚͕ͩऔΒΕΔͷͰɺ݁ՌΛݟ Δͷָ͕ ➤ ಋೖ΋ָ͍͢͝

Slide 54

Slide 54 text

NewRelic σϝϦοτɾݶք ➤ αϯϓϦϯάϓϩϑΝΠϥʹൺ΂ͨΒී௨͸஗͘ͳΔ ➤ ৄ͘͠ݟͨ͘ͳΔͱ͕͔͔ۚΔ ➤ ଞͷgemͱͷ݁߹͕ڧΊͳͷͰɺNewRelic͕ϝϯςΛαϘ Δͱಈ͔ͳ͘ͳΔ

Slide 55

Slide 55 text

perf ➤ ϝϦοτ ➤ CͷϨϕϧͰαϯϓϦϯάϓϩϑΝΠϧ͕Ͱ͖Δ ➤ ͳͷͰɺrubyࣗମͷϓϩϑΝΠϦϯάʹ࢖͑Δ ➤ σϝϦοτ ➤ ruby͕େମ1ͭͷؔ਺(vm_exec_core)ͰҰੜΛऴ͑ΔͷͰ ׂͱݟͮΒ͍ ➤ Linux͡Όͳ͍ͱ࢖͑ͳ͍

Slide 56

Slide 56 text

ϕϯνϚʔΧʔ

Slide 57

Slide 57 text

ඪ४ϥΠϒϥϦ benchmark ➤ ϝϦοτ ➤ ඪ४Ͱ࢖͑ΔͷͰɺΠϯετʔϧෆཁ ➤ σϝϦοτ ➤ ਫ਼౓͕ѱ͍

Slide 58

Slide 58 text

ඪ४ϥΠϒϥϦ benchmark ➤ ਫ਼౓ɺRuby 2.5Ͱ্͛·ͨ͠

Slide 59

Slide 59 text

ඪ४ϥΠϒϥϦ benchmark ➤ ਫ਼౓ɺRuby 2.5Ͱ্͛·ͨ͠ Լ ͕ 0 Ͱ ຒ · ͬͯ ͳ ͍ asakusa.rbͰॻ͍ͨ

Slide 60

Slide 60 text

benchmark-ips ➤ ϝϦοτ ➤ Έ΍͍͢ɺcompare! ͷग़ྗ͕௚ײత

Slide 61

Slide 61 text

ͦͷଞ

Slide 62

Slide 62 text

`rails s`ͷϩά ➤ ϝϦοτ ➤ Կ΋͠ͳͯ͘΋ݟΕΔ ➤ ோΊͯΕ͹݁ߏ༷ࢠ͕Θ͔Δ (͔ͳΓ͓͢͢Ί) ➤ ͜ΕීஈݟͯͨΒbullet.gemͱ͔͍Βͳ͘ͳ͍Ͱ͔͢ ➤ σϝϦοτ ➤ ΊͪΌͪ͘Όن໛͕େ͖͘ͳΔͱͪΐͬͱಡΉͷ͕େม

Slide 63

Slide 63 text

ܭଌ͍ͨ͠ՕॴΛফͯ͠ΈΔ ➤ ϝϦοτ ➤ Φʔόʔϔουͳ͠ɺܭଌͷ΄΅ཧ૝ܗ ➤ σϝϦοτ ➤ एׯख͕͔͔ؒΔ

Slide 64

Slide 64 text

ઐ༻ʹίʔυΛॻ͘ ➤ ϝϦοτ ➤ ಛघͳཁ݅ͷܭଌΛ͢Δͱ͖ʹඞཁ ➤ ྫ͑͹Sprocketsͷassets:precompileͰͲͷ֦ுࢠ͕Ͳͷ ͘Β͍࣌ؒΛ࢖͍ͬͯΔ͔Λௐ΂ΔͨΊʹɺίʔυΛॻ͘ ඞཁ͕͋ͬͨ ➤ σϝϦοτ ➤ ܹ͘͠໘౗͍͘͞

Slide 65

Slide 65 text

ָʹਖ਼͘͠ܭଌ͢Δํ๏ ·ͱΊ ➤ RailsͷϩάΛݟΔͷ͕Ұ൪ָͳͷͰݟΔ΂͖ ➤ ࣍ʹNewRelicΛ͍ΕͯோΊΔͷ͕අ༻ରޮՌ͕ߴ͍ ➤ Ͳ͏ͯ͠΋ஸೡͳܭଌ͕ඞཁͳ͚࣌ͩstackprofΛ࢖͏ɺඞཁ ͳΒίʔυ΋ॻ͘

Slide 66

Slide 66 text

ϨϏϡʔͰݟͨ ඇޮ཰ͳίʔυ

Slide 67

Slide 67 text

஫ҙ: ී௨͸ຊ౰ʹࠣࡉͳ࠷దԽΑΓ΋ͬͱଞʹ΍Δ͜ͱ͕͋Δ ͕ɺཪଆͰԿ͕ى͖͍ͯΔ͔ҙ͓ࣝͯ͘͠ʹӽͨ͜͠ͱ͸ͳ͍ ͱ͍͏͘Β͍ͷؾ࣋ͪͰฉ͍͍ͯͩ͘͞ ͜Ε͕໰୊ʹͳΔ͜ͱ͋Μ·Γͳ͍ͱࢥ͏͚Ͳɺ ؾʹͳͬͪΌ͏ΜͩΑͶɺϨϕϧͷࡶஊ

Slide 68

Slide 68 text

༨ܭͳActiveRecord::Base Πϯελϯεͷੜ੒

Slide 69

Slide 69 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ·ͩڐͤΔౕ

Slide 70

Slide 70 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ·ͩڐͤΔౕ ͜͏Ͱ ͢ Ͷ S E L E C T * ͢ Δ ཧ ༝ ͕ ͳ ͍ ɺ e x i s t s ? ͷ ํ ͕ ҙ ਤ ͕ ఻ Θ Γ ΍ ͢ ͍ ͱ ʹ ͔ ͘ A c t i v e R e c o rd : : B a s e ͷ Π ϯελ ϯε Λ ࡞ Δ ͷ ͸ ॏ ͍ ͔ Β ؾ ʹ ͳ Δ

Slide 71

Slide 71 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ݸਓతʹશ͘؃աͰ͖ͳౕ͍ (ͳ͓ Rails 4.x ࣌୅ͷ࿩) ߜ Γ ࠐ Έ ͷ ͨ Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ

Slide 72

Slide 72 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ݸਓతʹશ͘؃աͰ͖ͳౕ͍ (ͳ͓ Rails 4.x ࣌୅ͷ࿩) ໭ ͤ ߜ Γ ࠐ Έ ͷ ͨ Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ ͓͍ͪ͡ΌΜڈ೥ͷTokyuRubyձٞͰ΋ಉ͡࿩ͨ͠Ͱ͠ΐ (ຊ౰ʹؾʹ͍Βͳ͍ͷͰ2ճൃද͠·ͨ͠) E a g e r l o a d i n g ͷ ͨ Ί ͷ ϝ ι ο υ Λ ޡ ͬ ͨ ༻ ్ ʹ ࢖ ͏ ͷ ͸ ΍ Ί · ͠ ΐ ͏ ࢖ Θ Ε ͳ ͍ A c t i v e R e c o rd : : B a s e Π ϯε λ ϯε ͕ Ͳ Μ Ͳ Μ ࡞ Β Ε Δ

Slide 73

Slide 73 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ͜ͷίʔυΛϨϏϡʔͯͨ࣌͠୅ɺ#left_outer_joins (چ #outer_joins) ͕ೖͬͯཉͯ͘͠࢓ํ͕ͳ͔ͬͨ Ϩ Ϗϡ ʔ ͯ͠ ͨ Β Α ͘Θ ͔ Β Μ ͜ ͱ ΍ ͬͯ Δ ਓ ͍ ͨ … ͳ ΜͰ ͜ Ε ೖ ͬͯ ͳ ͍ ͷ …

Slide 74

Slide 74 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ ͜ͷίʔυΛϨϏϡʔͯͨ࣌͠୅ɺ#left_outer_joins (چ #outer_joins) ͕ೖͬͯཉͯ͘͠࢓ํ͕ͳ͔ͬͨ Ϩ Ϗϡ ʔ ͯ͠ ͨ Β Α ͘Θ ͔ Β Μ ͜ ͱ ΍ ͬͯ Δ ਓ ͍ ͨ … ͳ ΜͰ ͜ Ε ೖ ͬͯ ͳ ͍ ͷ … ͑ͬ # o u t e r _ j o i n s → # l e f t _ o u t e r _ j o i n s ʹ Ϧ ω ʔϜ ? ௕ ͢ ͗ ͯ ࢖ Θ ͳ ͘ ͳ ͍ ? ( ͜ Ε ͕ ೖ ͬ ͨ ௚ ޙ ʹ # l e f t _ j o i n s ͷ a l i a s ೖ Ε ͨ )

Slide 75

Slide 75 text

༨ܭͳActiveRecord::BaseΠϯελϯεͷੜ੒ ➤ Rails 5ɺਓྨօฏ࿨ ߜ Γ ࠐ Έ ͷ ͨ Ί ͷ L E F T J O I N ʹ i n c l u d e s Λ ࢖ ͍ ग़ ͢ ഐ

Slide 76

Slide 76 text

ͦͷଞͷ༨ܭͳ ΦϒδΣΫτੜ੒

Slide 77

Slide 77 text

༨ܭͳΦϒδΣΫτੜ੒ ➤ ͜ΕͲ͏ࢥ͍·͔͢

Slide 78

Slide 78 text

༨ܭͳΦϒδΣΫτੜ੒ ͳ ΜͰ ν Σ ο Ϋ ͯ͠ Δ ͷ ͜ Ε ܭ 3 ͭ Φ ϒδΣ Ϋ τ Λ ੜ ੒ ͯ͠ Δ ϝ ι ο υ ݺ ͼ ग़ ͠ ( ޙ ड़ ) ͩ ➤ String͸ͳΜ͔͍͍Μ͚ͩͲɺArray͕ຖճੜ੒͞ΕΔͷ͸ݸ ਓతʹؾʹͳͬͯ͠·͏

Slide 79

Slide 79 text

༨ܭͳΦϒδΣΫτੜ੒ ➤ ͜͏͍͏ϨϏϡʔΛͨ͠

Slide 80

Slide 80 text

༨ܭͳΦϒδΣΫτੜ੒ ➤ ͜͏͍͏ϨϏϡʔΛͨ͠ ͜ ͜ ͷ Φ ϒ δΣ Ϋ τ ੜ ੒ ͕ 1 ͭ ʹ ϝ ι ο υ ݺ ͼ ग़ ͠Ͱ ͸ ͳ ͘ ͳ ͬ ͨ ( ޙ ड़ ) fstringͱ͔frozen_string_literal ͸…هड़ྔͷׂʹॻ͍ͯܶతʹޮՌ͕ग़ͨ͜ͱ͕ͳ͍ ͷͰผʹࢦఠ͠ͳ͍ࣗ͠෼΋ॻ͔ͳ͍

Slide 81

Slide 81 text

ඇഁյతૢ࡞ ➤ ͜͏͍͏ίʔυΛ๻͕ॻ͍ͨ

Slide 82

Slide 82 text

ඇഁյతૢ࡞ ➤ ϨϏϡʔͰ͜͏௚ͨ͠ ඇഁյతϝιου͸࢓্༷ݩͷΦϒδΣΫτΛ͍͡Εͳ͍ͷͰɺ ৽ͨʹΦϒδΣΫτΛ࡞Δඞཁ͕͋Δ͕ɺ͜ͷ৔߹͸౰વ༨ܭ ͳϝϞϦΛ࢖͏ͷͰ஗͍

Slide 83

Slide 83 text

᩵୔ͳจࣈྻૢ࡞ ➤ ͜ΕͲ͏ࢥ͍·͔͢

Slide 84

Slide 84 text

᩵୔ͳจࣈྻૢ࡞ ➤ ๻ͳΒ͜͏ॻ͖·͢ +͸ຖճ৽͍͠StringΛ࡞ͬͯ͠·͏ จࣈྻ݁߹͸String InterpolationΛ࢖͏ͷ͕େମ଎͍ɺத਎͕จࣈྻ ͳΒ to_sͷݺͼग़͕͠εΩοϓ͞ΕΔ

Slide 85

Slide 85 text

᩵୔ͳจࣈྻૢ࡞ ➤ String Interpolation͕஗͍έʔε΋͋Δ?

Slide 86

Slide 86 text

᩵୔ͳจࣈྻૢ࡞ ➤ ͦͷέʔεͰ଎͘ͳΔɺΊͰ͍ͨ

Slide 87

Slide 87 text

όΠύεՄೳͳ ϝιουݺͼग़͠

Slide 88

Slide 88 text

ϝιουݺग़ͷόΠύε ➤ YARVʹ͸opt໋ྩͱ͍͏ͷ͕͋Δ ➤ ҎԼ͸࠶ఆٛ͞Ε͍ͯͳ͚Ε͹ϝιουݺͼग़͠ʹͳΒͳ͍ ➤ “foo”.freeze, [a, b].max, [a, b].min ➤ +, -, *, /, %, !=, <, >, <=, >=, << ➤ [], []=, size, empty?, succ, !, =~ ➤ ৄࡉ͸insns.defͱvminsnhelper.cΛݟ·͠ΐ͏

Slide 89

Slide 89 text

ϝιουݺग़ͷόΠύε ➤ any? empty?໰୊ ➤ any? ͸Arrayͷཁૉ͕1ͭͰ΋͋Δ͔Λ൑ఆ͢ΔͨΊͷϝιουͰ ͸ͳ͍ ➤ ͚Ͳ unless array.empty? ͡Όͳͯ͘ if array.any? ͬͯॻ͖͍ͨ ؾ࣋ͪࣗମ͸Θ͔Δɺ͕ɺඍົʹظ଴ͱҧ͏ڍಈͳͷ͕ؾʹͳ Δ ➤ …ͱ͍͏͍ͪΌ΋ΜΛ͚ͭΔͷʹɺempty?ͷํ͕଎͍ͷΛ࢖͑Δ (?) ➤ String#concat ΑΓ String#<< ͷํ͕଎͍ ➤ concatͷํ͕޷͖ͳਓ͸࢒೦Ͱͨ͠

Slide 90

Slide 90 text

ྫ֎ॲཧ

Slide 91

Slide 91 text

ྫ֎ॲཧ ➤ ੍ޚϑϩʔͷߏஙͷͨΊʹྫ֎Λ࢖͍ͬͯΔͷΛݟΔͱɺಡ Έʹ͍͘ͳ͋ͱࢥ͏͜ͱ͕͋Δ ➤ ͦ͏͍͏࣌ʹɺྫ֎͸஗͍ͱ͍͏͍ͪΌ΋ΜΛ͚͍ͭͯΔ(!?)

Slide 92

Slide 92 text

ྫ֎ॲཧ http://magazine.rubyist.net/?0033-YarvManiacs

Slide 93

Slide 93 text

ྫ֎ॲཧ

Slide 94

Slide 94 text

࠷ۙͷ࣮ࡍͷ ߴ଎Խࣄྫ

Slide 95

Slide 95 text

N+1 COUNTΫΤϦ

Slide 96

Slide 96 text

͜Ε͸ݩʑ͋ͬͨίʔυɻ๻͸2Օॴ௚͠·ͨ͠

Slide 97

Slide 97 text

ͱΓ͋͑ͣeager loading͕ൈ͚ͯͨͷͰ͚ͭ·͢ ࣮ࡍͷίʔυͰͷӨڹ 5,651ms → 3,822ms ଟ ෼ d e l e g a t e ʹ ΑΔ ݟ མ ͠

Slide 98

Slide 98 text

࣍͸Ͳ͏͢Δ͔? (ALTER͸͋Μ·Γ΍Γͨ͘ͳ͍લఏ)

Slide 99

Slide 99 text

͜͏͢Δͱɺcomment͕ͳ͍postͷnum_comments = 0͕ຒΊΒΕΔ ࣮ࡍͷίʔυͰͷӨڹ 3,822ms → 2,358ms (ݩͷ5,651msͷ2.4x)

Slide 100

Slide 100 text

Ͱɺ·͋ɺ͜ͷύϑΥʔϚϯεվળ͸͓͍ͱ͍ͯ

Slide 101

Slide 101 text

͜ͷN+1 COUNTΫΤϦͷ௚͠ํɺͲ͏ࢥ͍·͔͢ ͱΓ͋͑ͣcounter_cacheͷ͜ͱ͸๨Ε͍ͯͩ͘͞

Slide 102

Slide 102 text

๻͸݁ߏΠΠͳɺͱࢥ͍·ͨ͠ (๻ͷमਖ਼͡Όͳͯ͘ɺݩͷίʔυͷํ޲ੑ͕)

Slide 103

Slide 103 text

͜Ε͸ɺ3೥͘Β͍લͷRailsॳ৺ऀͷ๻͕ߟ͑ͨ௚͠ํ ݟͨ໨͸େ෼ΤϨΨϯτ ͜ͷgem͸Qiitaͱ͔KibelaͰଟ෼࢖ΘΕ͍ͯͯɺ͋ͱւ֎൛ CookpadͰ΋࢖ΘΕ͍ͯΔͷΛݟͨ

Slide 104

Slide 104 text

Ͱ΋ɺ(࢒೦ͳ͕Β)૯߹తʹݟͨΒ͜ͷgem࢖Θͳ͍ํ͕ଟ෼อकָͰ͢ ͜ ͍ ͭ ͕ A c t i v e R e c o rd ͷ ಺ ෦ A P I ʹ ৮ ͬͯ ͍ Δ ( ৮ Β ͟ Δ Λ ͑ ͳ ͍ ) ͷ Ͱ յ Ε Δ ɺ ͠ ͔ ΋ ௚ ͢ͷ ͕ ݁ ߏ େ ม Π ϯ λ ʔ φϧ ͳ A P I Λ ৮ ͬͯ ͍ Δ ͷ ͸ ͤ ͍ ͥ ͍ a re l _ t a b l e ͘ Β ͍

Slide 105

Slide 105 text

ΧοίΠΠίʔυΛॻͨ͘Ίʹ΍ΜͪΌΛ͢Δͷ͸Α͘ͳ͍ (·͋ɺ๻΋γϯϓϧʹॻ͖͍ͨͷͰ୭͔ຊମʹ͍Εͯ͘Εͯ΋͍͍Ͱ͢)

Slide 106

Slide 106 text

ڊେϖΠϩʔυAPI

Slide 107

Slide 107 text

ͦͦ͜͜Ͱ͔͍ΧϥϜ͕͋Δςʔϒϧ ➤ ݁ߏେ͖͍σʔλ͕ೖͬͯΔΧϥϜ͕2ͭ͋Δςʔϒϧ͕͋Δ

Slide 108

Slide 108 text

ͦͦ͜͜Ͱ͔͍ΧϥϜ͕͋Δςʔϒϧ ➤ ݁ߏେ͖͍σʔλ͕ೖͬͯΔΧϥϜ͕2ͭ͋Δςʔϒϧ͕͋Δ Ͱ ͔ ͍

Slide 109

Slide 109 text

͜͏͍͏API͕͋ͬͨ

Slide 110

Slide 110 text

͝ཡͷ௨Γɺϖʔδωʔγϣϯ͕ͳ͍

Slide 111

Slide 111 text

๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ

Slide 112

Slide 112 text

๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍

Slide 113

Slide 113 text

๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ: શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏

Slide 114

Slide 114 text

๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ: શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏ ➤ Cࢯ: ͏ʔΜͰ΋ΫϥΠΞϯτଆͰιʔτ΋ݕࡧ΋ͯ͠Δ͔Β ϖʔδωʔγϣϯ͸೉͍͠͠ɺͦͷͨΊʹ΋৽͘͠ΧϥϜ͕ ཁΔ͚Ͳɺ͜ͷςʔϒϧALTER͢Δͷ೉͍͠Θ…

Slide 115

Slide 115 text

๻͕ೖΔલɺ͜͏͍͏΍ΓͱΓ͕͋ͬͨ ➤ ্࢘: ͜ͷAPIɺ6000ݸදࣔ͞ΕΔ͓٬༷ͷ؀ڥͩͱ7෼͔ ͔ͬͯλΠϜΞ΢τ͢ΔΜ͚ͩͲ ➤ Aࢯ: εΩʔϚౕͬͯผςʔϒϧʹͨ͠ํ͕͍͍Μ͡Όͳ͍ ➤ Bࢯ: શ͘ܭଌͯ͠ͳ͍͠ԿͰ஗͍ͷ͔Α͘Θ͔ΒΜ͚Ͳɺ ϖʔδωʔγϣϯͨ͠ΒΑͦ͞͏ ➤ Cࢯ: ͏ʔΜͰ΋ΫϥΠΞϯτଆͰιʔτ΋ݕࡧ΋ͯ͠Δ͔Β ϖʔδωʔγϣϯ͸೉͍͠͠ɺͦͷͨΊʹ΋৽͘͠ΧϥϜ͕ ཁΔ͚Ͳɺ͜ͷςʔϒϧALTER͢Δͷ೉͍͠Θ… ➤ ALTERͰࢭ·ͬͨ··1೥ޙ… Aࢯ, Bࢯ, Cࢯ, ୀ৬!!

Slide 116

Slide 116 text

๻͕ೖ͖͔ͬͯͯΒ ➤ ๻: stackprofͰܭଌͨ͠ΒΫΤϦͱ JSON.parse ͕൒ʑͰɺ ΫΤϦ΋Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͱ଎͘ͳΔͬΆ͍

Slide 117

Slide 117 text

๻͕ೖ͖͔ͬͯͯΒ ➤ ๻: stackprofͰܭଌͨ͠ΒΫΤϦͱ JSON.parse ͕൒ʑͰɺ ΫΤϦ΋Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͱ଎͘ͳΔͬΆ͍ ➤ ๻: ͜ͷͰౕ͔͍ͦ΋ͦ΋࢖ͬͯͳ͘ͳ͍?

Slide 118

Slide 118 text

͜ͷίʔυΛྑ͘ݟΔͱɺ༨ܭͳSELECT, JSON.parse͕͋Δ p re v i e w ࢖ ͬͯ ͳ ͍ ΍ Δ ඞ ཁ ͳ ͍

Slide 119

Slide 119 text

࠷ େ ͷ Χ ϥϜ ͕ S E L E C T ͞ Ε ͳ ͘ ͳ Γ ɺ Ϋ Τ Ϧ ͕ ߴ ଎ Խ ࢖ Θ Εͯ ͍ ͳ ͍ ͷ ʹ ॏ ͍ J S O N . p a r s e ͕ ૸ Β ͳ ͘ ͳ ͬ ͨ ෆཁͳSELECT, JSON.parseͷআڈ ϨεϙϯελΠϜ: 7෼ˠ31ඵ ͪΌΜͱܭଌΛ͢Δͱɺগ ͳ͍࿑ྗͰܶతͳޮՌ͕ಘ ΒΕΔ͜ͱ΋͋Δ

Slide 120

Slide 120 text

࣍ͷ๻ͷมߋ ➤ ๻: ΋͏ҰݸͰ͔͍ΧϥϜͷschema_json͸ฦͯ͠Δ͚Ͳɺ͜ ΕΫϥΠΞϯτͰදࣔͯ͠ͳ͘ͳ͍…? ϖʔδωʔγϣϯ͠ͳ ͯ͘΋͜Ε࡟Ε͹଎͘ͳΔͬΆ͍

Slide 121

Slide 121 text

࣍ͷ๻ͷมߋ ➤ ๻: ΋͏ҰݸͰ͔͍ΧϥϜͷschema_json͸ฦͯ͠Δ͚Ͳɺ͜ ΕΫϥΠΞϯτͰදࣔͯ͠ͳ͘ͳ͍…? ϖʔδωʔγϣϯ͠ͳ ͯ͘΋͜Ε࡟Ε͹଎͘ͳΔͬΆ͍ ➤ ্࢘: schema_json͔ΒΫϥΠΞϯτଆͰclumns_countΛܭ ࢉͯ͠Δ͔Βඞཁɺ͚ͩͲΧϥϜ͕ͳ͍ ➤ ๻: ALTER͕ཁΔͷ͔…

Slide 122

Slide 122 text

࣍ͷ๻ͷมߋ ➤ ๻: ΋͏ҰݸͰ͔͍ΧϥϜͷschema_json͸ฦͯ͠Δ͚Ͳɺ͜ ΕΫϥΠΞϯτͰදࣔͯ͠ͳ͘ͳ͍…? ϖʔδωʔγϣϯ͠ͳ ͯ͘΋͜Ε࡟Ε͹଎͘ͳΔͬΆ͍ ➤ ্࢘: schema_json͔ΒΫϥΠΞϯτଆͰclumns_countΛܭ ࢉͯ͠Δ͔Βඞཁɺ͚ͩͲΧϥϜ͕ͳ͍ ➤ ๻: ALTER͕ཁΔͷ͔… ➤ ผͷνʔϜ: ͦͷςʔϒϧͷෛՙ͕Լ͕Δౕ͍͍࡞ͬͨͰ ➤ ๻: ϤογϟALTERͯ͠Ͱ͔͍ΧϥϜͷSELECTΛ΍ΊΔͧ

Slide 123

Slide 123 text

·ͣ͜ͷALTER͕ඞཁͩͬͨ ௥ Ճ

Slide 124

Slide 124 text

࣍ʹ৽͍͠ϓϩύςΟΛ௥Ճ

Slide 125

Slide 125 text

S E L E C T Λ ֎ ͤΔ Α ͏ ʹ ͠ ͨ

Slide 126

Slide 126 text

ෆཁͳSELECT, JSON.parseͷআڈ (2) ϨεϙϯελΠϜ: 31ඵˠ17ඵ ϖʔδωʔγϣϯΛ͍ΕΔͱAPIଆ΋ΫϥΠΞϯτଆ΋݁ߏ࣮૷͕େม ʹͳΔ͕ɺͦΕʹൺ΂ΔͱͲͪΒͷมߋ΋࠷খݶͰࡁΜͩ

Slide 127

Slide 127 text

ͦͷޙ ➤ ๻: NewRelicΛݟΔͱͳΜ͔jbuilderͷϨΠϠʔͰϘτϧωο ΫʹͳͬͯΔ…? ➤ ๻: stackprofͰݟΔͱɺΫΤϦ͸΋͏஗͘ͳ͍͚ͲɺͳΜ͔ ActionViewͷfind_templateͰ஗͘ͳͬͯΔͳ…Ͳ͏͢Δ͔…

Slide 128

Slide 128 text

ͦͷޙ ➤ ๻: NewRelicΛݟΔͱͳΜ͔jbuilderͷϨΠϠʔͰϘτϧωο ΫʹͳͬͯΔ…? ➤ ๻: stackprofͰݟΔͱɺΫΤϦ͸΋͏஗͘ͳ͍͚ͲɺͳΜ͔ ActionViewͷfind_templateͰ஗͘ͳͬͯΔͳ…Ͳ͏͢Δ͔… ➤ Dࢯ: ͜ΕҎ߱͸ྲྀੴʹϖʔδωʔγϣϯ͔͠΍Δ͜ͱͳ͍͔ Βɺ೚ҙͷΧϥϜͰιʔτ͕Ͱ͖ͯݕࡧ΋Ͱ͖Δϖʔδωʔ γϣϯΛ͕Μ͹࣮ͬͯ૷͢ΔͰ ➤ ݁ߏ͕͔͔࣌ؒͬͯΔ࣮͠૷΋େ෼େ͖͍

Slide 129

Slide 129 text

ͦͷޙɺ͋Δ೔ͷ͜ͱ

Slide 130

Slide 130 text

amatsuda/jb ➤ ΋ͱ΋ͱ஌ͬͯͨ΋ͷͷ࢖ͬͨ͜ͱ͸ͳ͔͕ͬͨɺTokyuͰ໊ લΛݟͨͷͰ·ͨREADMEΛಡΜͰ͍ͨ

Slide 131

Slide 131 text

amatsuda/jb ➤ ΋ͱ΋ͱ஌ͬͯͨ΋ͷͷ࢖ͬͨ͜ͱ͸ͳ͔͕ͬͨɺTokyuͰ໊ લΛݟͨͷͰ·ͨREADMEΛಡΜͰ͍ͨ find_template only once beforehand!?

Slide 132

Slide 132 text

render collection: ͷ࣮૷ ➤ ͔ͨ͠ʹͦ͏ͳͬͯΔ ϧ ʔϓ ϧ ʔϓ ͷ ֎ Ͱ f i n d _ t e m p l a t e

Slide 133

Slide 133 text

jbuilderͷ࣮૷ ➤ ͬͪ͜͸μϝͦ͏ c o l l e c t i o n ͷ ϧ ʔϓ ͷ ಺ ଆ Ͱ ී ௨ ʹ re n d e r ͯ͠ ͍ Δ

Slide 134

Slide 134 text

ͳͷͰɺjbuilder→jbʹͯ͠Έͨ ➤ ҙ֎ͱ͏·͍͔͘ͳ͔ͬͨ ➤ ͦ΋ͦ΋਺͕ଟ͗ͯ͢ɺfind_templateҎ֎ͷΦʔόʔϔου΋ ແࢹͰ͖ͳͦ͞͏ɺ·ͨ͸jbͷϞϯΩʔύονͷӨڹ͔ ➤ jbͷํ͕ΦϒδΣΫτΛ࡞ͬͯ͠·͏? (ະௐࠪ) ϨεϙϯελΠϜ: 17ඵˠ40ඵ ܭଌͯ͠Έͳ͍ͱԿ͕ى͖Δ͔Θ͔Βͳ͍ɺ͋Δ͍͸ɺϓϩϑΝΠϦϯ ά݁ՌΛਖ਼͘͠ಡΉͷ͸೉͍͠

Slide 135

Slide 135 text

jbͷ··ɺpartialΛͦͷ৔ʹల։ͨ͠Β଎͘ͳͬͨ ➤ find_templateҎ֎ʹ΋ActionViewͷpartial renderingʹ͸ Φʔόʔϔου͕͋Δ ϨεϙϯελΠϜ: 40ඵˠ9ඵ ͔͠͠partial͸ڞ༗͍ͨ͠ͷͰɺ΍ͬͺΓϖʔδωʔγϣϯ͢Δ͔͠ͳ ͍ɺͱ͍͏ؾ࣋ͪʹͳΓͭͭ͋Δ

Slide 136

Slide 136 text

·ͱΊ ➤ ਖ਼͘͠ܭଌ͢Δͷ͸೉͍͠͠໘౗͍͘͞ ➤ ύϑΥʔϚϯεվળ͸΍Βͳ͍͍ͯ͘ͳΒ΍Δͳ ➤ VMͷؾ࣋ͪΛߟ͑ͯ࠷ॳ͔Β଎͍ίʔυΛॻ͜͏ ➤ ܭଌ͢ΔͳΒՄೳͳݶΓָͳํ๏Λબ΅͏ ➤ ࢖͍ͬͯΔܭଌπʔϧͷ࢓૊ΈΛ஌Ζ͏