Slide 1

Slide 1 text

©2018 Wantedly, Inc. Try JIT compiler for Ruby 2.6 28.Mar.2018 - Nao Minami (@south37)

Slide 2

Slide 2 text

©2018 Wantedly, Inc. ࣗݾ঺հ

Slide 3

Slide 3 text

©2018 Wantedly, Inc. Nao Minami / @south37, @minami7o Software engineer @ Wantedly, Inc.

Slide 4

Slide 4 text

©2018 Wantedly, Inc.  3VCZͷ+*5ͱ͸  3VCZͷ+*5Λࢼͯ͠ΈΔ  ·ͱΊ ࠓ೔࿩͢಺༰

Slide 5

Slide 5 text

©2018 Wantedly, Inc.  3VCZͷ+*5ͱ͸  3VCZͷ+*5Λࢼͯ͠ΈΔ  ·ͱΊ ࠓ೔࿩͢಺༰

Slide 6

Slide 6 text

©2018 Wantedly, Inc. 3VCZͷUSVOLʹ͸ +*5͕࣮૷͞Ε͍ͯΔʂ 3VCZͷ+*5ͱ͸

Slide 7

Slide 7 text

©2018 Wantedly, Inc. Vladimir ͞Μ͕࣮૷ͨ͠MJIT (JITج൫) 3VCZͷ+*5ͱ͸ k0kubun ͞Μ͕࣮૷ͨ͠YARV-MJIT (JITDPNQJMFS)

Slide 8

Slide 8 text

©2018 Wantedly, Inc. 3VCZͷ+*5ͱ͸

Slide 9

Slide 9 text

©2018 Wantedly, Inc. 3VCZͷ+*5ͱ͸ ৄࡉ͸ҎԼͷϒϩάϙετΛࢀর IUUQTNFEJVNDPN!LLVCVOUIFNFUIPEKJUDPNQJMFSGPSSVCZFFD

Slide 10

Slide 10 text

©2018 Wantedly, Inc. 3VCZͷ+*5ͱ͸ +*5ʹ͍ͭͯৄ͘͠஌Γ͍ͨํ͸ҎԼ͕͓͢͢Ί IUUQXXXPSBDMFDPNXFCGPMEFSUFDIOFUXPSLKQKBWBNBHB[JOF+BWB."+*5QEG

Slide 11

Slide 11 text

©2018 Wantedly, Inc.  3VCZͷ+*5ͱ͸  3VCZͷ+*5Λࢼͯ͠ΈΔ  ·ͱΊ ࠓ೔࿩͢಺༰

Slide 12

Slide 12 text

©2018 Wantedly, Inc. ͔ͤͬ͘ͳͷͰࢼͯ͠ΈΑ͏ʂ 3VCZͷ+*5Λࢼͯ͠ΈΔ

Slide 13

Slide 13 text

©2018 Wantedly, Inc. %&.0 3VCZͷ+*5Λࢼͯ͠ΈΔ

Slide 14

Slide 14 text

©2018 Wantedly, Inc. 3VCZͷ+*5Λࢼͯ͠ΈΔ $ rbenv install --list | grep 2.6 1.8.6-p286 1.9.3-p286 2.2.6 2.6.0-dev 2.6.0-preview1 rbx-2.2.6 rbx-2.6 $ rbenv install 2.6.0-preview1 $ rbenv global 2.6.0-preview1 QSFWJFXΛSCFOWͰJOTUBMM

Slide 15

Slide 15 text

©2018 Wantedly, Inc. 3VCZͷ+*5Λࢼͯ͠ΈΔ +PIO)BXUIPSOϒϩάͷCFODIΛࢼ͢ IUUQTXXXKPIOIBXUIPSODPNQMBZJOHXJUISVCZKJUNKJU def calculate(a, b, n = 40_000_000) n.times.count do a = a * 16807 % 2147483647 b = b * 48271 % 2147483647 (a & 0xffff) == (b & 0xffff) end end raise unless calculate(65, 8921) == 588 p result: calculate(699, 124)

Slide 16

Slide 16 text

©2018 Wantedly, Inc. $ ruby tmp/bench.rb {:result=>600} ruby tmp/playing.rb 10.68s user 0.12s system 97% cpu 11.084 total $ ruby --disable-gems --jit tmp/bench.rb {:result=>600} ruby --disable-gems --jit tmp/playing.rb 8.12s user 0.13s system 103% cpu 7.973 total 3VCZͷ+*5Λࢼͯ͠ΈΔ +*5ͰTT΁վળʂʂ

Slide 17

Slide 17 text

©2018 Wantedly, Inc. ͍͢͝ʂ 3VCZͷ+*5Λࢼͯ͠ΈΔ

Slide 18

Slide 18 text

©2018 Wantedly, Inc. +*5ͷϩά΋ݟͯΈΑ͏ 3VCZͷ+*5Λࢼͯ͠ΈΔ

Slide 19

Slide 19 text

©2018 Wantedly, Inc. $ ruby --disable-gems --jit --jit-verbose=2 tmp/bench.rb MJIT: CC defaults to clang MJIT: tmp_dir is … Creating precompiled header Starting process: clang clang -w -O3 -emit-pch -o ….h.gch …/rb_mjit_min_header-2.6.0.h start compile: block in calculate@tmp/bench.rb:2 -> ….c Starting process: clang clang -dynamic -bundle -O3 -include-pch ….h.gch -o …/ _ruby_mjit_p23579u0.bundle ….c -L…/lib -Wl,-undefined,dynamic_lookup -Wl,- multiply_defined,suppress JIT success (195.0ms): block in calculate@tmp/bench.rb:2 -> ….c {:result=>600} Canceling pch and worker threads Successful MJIT finish ruby --disable-gems --jit --jit-verbose=2 tmp/bench.rb 8.59s user 0.14s system 102% cpu 8.480 total 3VCZͷ+*5Λࢼͯ͠ΈΔ AŠKJUWFSCPTFAΦϓγϣϯΛ͚࣮ͭͯߦ DPNQJMF։࢝

Slide 20

Slide 20 text

©2018 Wantedly, Inc. $ ruby --disable-gems --jit --jit-verbose=2 tmp/bench.rb MJIT: CC defaults to clang MJIT: tmp_dir is … Creating precompiled header Starting process: clang clang -w -O3 -emit-pch -o ….h.gch …/rb_mjit_min_header-2.6.0.h start compile: block in calculate@tmp/bench.rb:2 -> ….c Starting process: clang clang -dynamic -bundle -O3 -include-pch ….h.gch -o …/ _ruby_mjit_p23579u0.bundle ….c -L…/lib -Wl,-undefined,dynamic_lookup -Wl,- multiply_defined,suppress JIT success (195.0ms): block in calculate@tmp/bench.rb:2 -> ….c {:result=>600} Canceling pch and worker threads Successful MJIT finish ruby --disable-gems --jit --jit-verbose=2 tmp/bench.rb 8.59s user 0.14s system 102% cpu 8.480 total 3VCZͷ+*5Λࢼͯ͠ΈΔ AŠKJUWFSCPTFAΦϓγϣϯΛ͚࣮ͭͯߦ NTͰDPNQJMFऴྃ

Slide 21

Slide 21 text

©2018 Wantedly, Inc. 3VCZͷ+*5Λࢼͯ͠ΈΔ  #MPDL΍.FUIPE୯ҐͰ+*5 w Կ౓΋ݺ͹ΕΔIPUTQPU͕UBSHFU  +*5ʹ͸਺ඦNT͘Β͍͔͔Δ w ͋Δఔ౓ॏ͍ॲཧʹରͯ͠ޮՌΛൃش

Slide 22

Slide 22 text

©2018 Wantedly, Inc. $ ruby --jit --jit-verbose=2 tmp/bench.rb . . . . ruby --jit --jit-verbose=2 tmp/bench.rb 12.67s user 0.73s system 148% cpu 9.055 total 3VCZͷ+*5Λࢼͯ͠ΈΔ ͪͳΈʹAŠEJTBCMFHFNTAΦϓγϣϯΛ֎͢ ͱɻɻɻʁ ෆཁͳDPNQJMF͕૸ͬͯΉ͠Ζ஗͘ͳΔ

Slide 23

Slide 23 text

©2018 Wantedly, Inc. 3VCZͷ+*5Λࢼͯ͠ΈΔ ॲཧͷ௕͍CBUDI΍EBFNPO QSPDFTTʹ+*5͸޲͍͍ͯͦ͏ʂ

Slide 24

Slide 24 text

©2018 Wantedly, Inc.  3VCZͷ+*5ͱ͸  3VCZͷ+*5Λࢼͯ͠ΈΔ  ·ͱΊ ࠓ೔࿩͢಺༰

Slide 25

Slide 25 text

©2018 Wantedly, Inc. ·ͱΊ w 3VCZʹ͸+*5͕དྷΔ w ͢ͰʹUSVOLʹNFSHF͞ΕͯΔ w ·ͩ·ͩߥ࡟Γ͚ͩͲɺҰ෦ͷϕϯνϚʔΫͰ͸ܶతͳվળ͕ݟΒΕΔ w 3VCZY࣮ݱʹ޲͚ͯண࣮ʹਐาͯ͠Δʂ

Slide 26

Slide 26 text

©2018 Wantedly, Inc.  3VCZͷ+*5ͱ͸  3VCZͷ+*5Λࢼͯ͠ΈΔ  ·ͱΊ  ͓·͚ ࠓ೔࿩͢಺༰

Slide 27

Slide 27 text

©2018 Wantedly, Inc. ࢿྉஔ৔ w 5IFNFUIPE+*5DPNQJMFSGPS3VCZ w IUUQTNFEJVNDPN!LLVCVOUIFNFUIPEKJUDPNQJMFSGPSSVCZFFD w +*5ίϯύΠϥͷ࣮ࡍͷಈ࡞ w IUUQXXXPSBDMFDPNXFCGPMEFSUFDIOFUXPSLKQKBWBNBHB[JOF+BWB."+*5QEG