Slide 1

Slide 1 text

Fast Code for Ruby @284km

Slide 2

Slide 2 text

͸͍͍͞ʂ

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ Ruby Ͱ଎͍ίʔυΛॻ͘ benchmark_driver ͕͘͢͝ྑ͍ Ruby ͷָ͠ΈํΛͻͱͭ

Slide 4

Slide 4 text

଎͍ίʔυΛॻ͘

Slide 5

Slide 5 text

଎͍ίʔυΛॻ͘ ଌఆ ϕϯνϚʔΧʔ

Slide 6

Slide 6 text

ϕϯνϚʔΧʔ benchmark.rb (ඪ४ఴ෇ϥΠϒϥϦ) evanphx/benchmark-ips k0kubun/benchmark_driver

Slide 7

Slide 7 text

଎͍ίʔυ ಉ݁͡Ռ͕ಘΒΕΔෳ਺ͷॻ͖ํ ܭଌͯ͠ɺ଎͍΄͏͕଎͍ લఏ: ࠓճͷϕϯνϚʔΫ͸๻ͷ MBP Ͱ࣮ߦͨ͠΋ͷͰ͢

Slide 8

Slide 8 text

benchmark_driver e.g. ෳ਺ͷॲཧܥ ग़ྗܗࣜ (.md Մ)

Slide 9

Slide 9 text

Hash#keys.each Hash#each_key

Slide 10

Slide 10 text

Hash#keys.each Hash#each_key

Slide 11

Slide 11 text

଎͍ίʔυ ৚݅ʹґଘ͢Δ৔߹͕͋Δ ඞͣͦͷॻ͖ํ͕ྑ͍ͱ͸ݴ͑ͳ͍ έʔε͕͋Δ (e.g. gsub / tr)

Slide 12

Slide 12 text

gsub tr

Slide 13

Slide 13 text

gsub tr

Slide 14

Slide 14 text

gsub tr

Slide 15

Slide 15 text

gsub tr

Slide 16

Slide 16 text

gsub tr

Slide 17

Slide 17 text

gsub tr

Slide 18

Slide 18 text

଎͍ίʔυ Ͳ͏͍͏࣌ʹ༗ޮ͔Λ஌ΔͱΑ͞ ͦ͏ ࣮૷Λ೷͘ͱ෼͔Δ͜ͱ͕͋Δ

Slide 19

Slide 19 text

Bang method ഁյత / ඇഁյత ͳϝιουͷྫ ͜ͷ࣮૷͸ݟ΍͍͢ͱࢥ͍·͢

Slide 20

Slide 20 text

Hash#merge Hash#merge! ͜͜Ͱ͸αϯϓϧίʔυ͸ͦ Ε΄ͲॏཁͰ͸ͳ͘ɺ

Slide 21

Slide 21 text

Hash#merge Hash#merge! ͜͜Ͱ͸αϯϓϧίʔυ͸ͦ Ε΄ͲॏཁͰ͸ͳ͘ɺ ଎౓ࠩͷཧ༝Λ௥ͬͯΈΔ

Slide 22

Slide 22 text

Hash#merge Hash#merge! dup ͨ͠΋ͷΛ౉ͯ݁͠ ՌΛฦ͍ͯ͠ΔͷͰͦͷ෼ ஗͍

Slide 23

Slide 23 text

଎͞ ͱɺಡΈ΍͢͞

Slide 24

Slide 24 text

each_with_index while

Slide 25

Slide 25 text

each_with_index while

Slide 26

Slide 26 text

ಡΈ΍͢͞େࣄ ಡΈ΍͢͞ͱ͸…(ޙͰ࿩୊ʹ͠·͢ ͕ yield / Proc#call ΋ͦ͏Ͱ͢ΑͶ) ࢓ࣄͰॻ͘ίʔυͰ͸ɺνʔϜͷࣄ ৘ͳͲʹΑͬͯԿ͕ಡΈ΍͍͔͢͸ม ΘΓͦ͏Ͱ͸͋Δʢ๻ͷײ૝

Slide 27

Slide 27 text

Rubocop::Cop::Performance ύϑΥʔϚϯε͕վળ͞Εͦ͏ͳͱ ͜ΖΛࢦఠͯ͘͠ΕΔ ੩తղੳπʔϧʹཔΔ͜ͱ΋༗ޮ ͜ͷؒͻͱͭࢦఠ͞Ε·ͨ͠

Slide 28

Slide 28 text

String#match String#match?

Slide 29

Slide 29 text

String#match String#match?

Slide 30

Slide 30 text

String#match String#match?

Slide 31

Slide 31 text

String#match String#match? MatchData ΦϒδΣΫτ Λฦ͢ʢϚονͨ͠৔߹ʣ

Slide 32

Slide 32 text

String#match String#match? MatchData ΦϒδΣΫτ Λฦ͢ʢϚονͨ͠৔߹ʣ rb_reg_match_p() ͸ɺ Ϛονͨ͠Β true ͠ͳ͚ Ε͹ false Λฦ͢ɻ

Slide 33

Slide 33 text

Ruby 2.5 ࢖͍ͬͯ·͔͢ʁ όʔδϣϯΞοϓͱڞʹվળ͞ΕΔ ෦෼͸஌͓ͬͯ͘ͱศར

Slide 34

Slide 34 text

unpack1 unpack.first String#unpack1 ͸ 2.4 Ͱೖ ͬͨ

Slide 35

Slide 35 text

unpack1 unpack.first String#unpack1 ͸ 2.4 Ͱೖ ͬͨ

Slide 36

Slide 36 text

yield Proc#call 2.5 Ͱ Proc#call ͕଎͘ ͳͬͨ

Slide 37

Slide 37 text

yield Proc#call

Slide 38

Slide 38 text

yield Proc#call

Slide 39

Slide 39 text

࠷৽ͷ Ruby ஌ͬͯΔͱ࢓ࣄָ͕ʹͳͬͨΓ͢Δ ஌Δͱɺ௥͏ͷָ͕͘͠ͳΔϧʔϓ JIT Λ༗ޮʹ͢Δͱɺ݁ՌͷมΘΔ ϕϯνϚʔΫ΋͋Γͦ͏ (2.6.0)

Slide 40

Slide 40 text

·ͱΊ ʹ;͐ʔͰʔͼΔ benchmark_driver ͕͘͢͝ྑ͍ Fast Code ͱ͍͏ Ruby ͷָ͠Έํ Ruby ͷ࣮૷Λ೷͍ͯΈΔ ೖΓޱͱͯ͠ͷϕϯνϚʔΫ΋ྑ͍