Meguro.rb#13 で「Ruby の JIT を触ってみた話」をしました cf. https://megurorb.connpass.com/event/82076/
©2018 Wantedly, Inc.Try JIT compilerfor Ruby 2.628.Mar.2018 - Nao Minami (@south37)
View Slide
©2018 Wantedly, Inc.ࣗݾհ
©2018 Wantedly, Inc.Nao Minami / @south37, @minami7oSoftware engineer@ Wantedly, Inc.
©2018 Wantedly, Inc. 3VCZͷ+*5ͱ 3VCZͷ+*5Λࢼͯ͠ΈΔ ·ͱΊࠓ͢༰
©2018 Wantedly, Inc.3VCZͷUSVOLʹ+*5͕࣮͞Ε͍ͯΔʂ3VCZͷ+*5ͱ
©2018 Wantedly, Inc.Vladimir ͞Μ͕࣮ͨ͠MJIT (JITج൫)3VCZͷ+*5ͱk0kubun ͞Μ͕࣮ͨ͠YARV-MJIT (JITDPNQJMFS)
©2018 Wantedly, Inc.3VCZͷ+*5ͱ
©2018 Wantedly, Inc.3VCZͷ+*5ͱৄࡉҎԼͷϒϩάϙετΛࢀরIUUQTNFEJVNDPN!LLVCVOUIFNFUIPEKJUDPNQJMFSGPSSVCZFFD
©2018 Wantedly, Inc.3VCZͷ+*5ͱ+*5ʹ͍ͭͯৄ͘͠Γ͍ͨํҎԼ͕͓͢͢ΊIUUQXXXPSBDMFDPNXFCGPMEFSUFDIOFUXPSLKQKBWBNBHB[JOF+BWB."+*5QEG
©2018 Wantedly, Inc.͔ͤͬ͘ͳͷͰࢼͯ͠ΈΑ͏ʂ3VCZͷ+*5Λࢼͯ͠ΈΔ
©2018 Wantedly, Inc.%&.03VCZͷ+*5Λࢼͯ͠ΈΔ
©2018 Wantedly, Inc.3VCZͷ+*5Λࢼͯ͠ΈΔ$ rbenv install --list | grep 2.61.8.6-p2861.9.3-p2862.2.62.6.0-dev2.6.0-preview1rbx-2.2.6rbx-2.6$ rbenv install 2.6.0-preview1$ rbenv global 2.6.0-preview1QSFWJFXΛSCFOWͰJOTUBMM
©2018 Wantedly, Inc.3VCZͷ+*5Λࢼͯ͠ΈΔ+PIO)BXUIPSOϒϩάͷCFODIΛࢼ͢IUUQTXXXKPIOIBXUIPSODPNQMBZJOHXJUISVCZKJUNKJUdef calculate(a, b, n = 40_000_000)n.times.count doa = a * 16807 % 2147483647b = b * 48271 % 2147483647(a & 0xffff) == (b & 0xffff)endendraise unless calculate(65, 8921) == 588p result: calculate(699, 124)
©2018 Wantedly, Inc.$ ruby tmp/bench.rb{:result=>600}ruby tmp/playing.rb 10.68s user 0.12ssystem 97% cpu 11.084 total$ ruby --disable-gems --jit tmp/bench.rb{:result=>600}ruby --disable-gems --jit tmp/playing.rb8.12s user 0.13s system 103% cpu 7.973 total3VCZͷ+*5Λࢼͯ͠ΈΔ+*5ͰTTվળʂʂ
©2018 Wantedly, Inc.͍͢͝ʂ3VCZͷ+*5Λࢼͯ͠ΈΔ
©2018 Wantedly, Inc.+*5ͷϩάݟͯΈΑ͏3VCZͷ+*5Λࢼͯ͠ΈΔ
©2018 Wantedly, Inc.$ ruby --disable-gems --jit --jit-verbose=2 tmp/bench.rbMJIT: CC defaults to clangMJIT: tmp_dir is …Creating precompiled headerStarting process: clang clang -w -O3 -emit-pch -o ….h.gch …/rb_mjit_min_header-2.6.0.hstart compile: block in calculate@tmp/bench.rb:2 -> ….cStarting 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,suppressJIT success (195.0ms): block in calculate@tmp/bench.rb:2 -> ….c{:result=>600}Canceling pch and worker threadsSuccessful MJIT finishruby --disable-gems --jit --jit-verbose=2 tmp/bench.rb 8.59s user 0.14s system 102% cpu8.480 total3VCZͷ+*5Λࢼͯ͠ΈΔAKJUWFSCPTFAΦϓγϣϯΛ͚࣮ͭͯߦDPNQJMF։࢝
©2018 Wantedly, Inc.$ ruby --disable-gems --jit --jit-verbose=2 tmp/bench.rbMJIT: CC defaults to clangMJIT: tmp_dir is …Creating precompiled headerStarting process: clang clang -w -O3 -emit-pch -o ….h.gch …/rb_mjit_min_header-2.6.0.hstart compile: block in calculate@tmp/bench.rb:2 -> ….cStarting 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,suppressJIT success (195.0ms): block in calculate@tmp/bench.rb:2 -> ….c{:result=>600}Canceling pch and worker threadsSuccessful MJIT finishruby --disable-gems --jit --jit-verbose=2 tmp/bench.rb 8.59s user 0.14s system 102% cpu8.480 total3VCZͷ+*5Λࢼͯ͠ΈΔAKJUWFSCPTFAΦϓγϣϯΛ͚࣮ͭͯߦNTͰDPNQJMFऴྃ
©2018 Wantedly, Inc.3VCZͷ+*5Λࢼͯ͠ΈΔ #MPDL.FUIPE୯ҐͰ+*5w ԿݺΕΔIPUTQPU͕UBSHFU +*5ʹඦNT͘Β͍͔͔Δw ͋Δఔॏ͍ॲཧʹରͯ͠ޮՌΛൃش
©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 total3VCZͷ+*5Λࢼͯ͠ΈΔͪͳΈʹAEJTBCMFHFNTAΦϓγϣϯΛ֎͢ͱɻɻɻʁෆཁͳDPNQJMF͕ͬͯΉ͠Ζ͘ͳΔ
©2018 Wantedly, Inc.3VCZͷ+*5Λࢼͯ͠ΈΔॲཧͷ͍CBUDIEBFNPOQSPDFTTʹ+*5͍͍ͯͦ͏ʂ
©2018 Wantedly, Inc.·ͱΊw 3VCZʹ+*5͕དྷΔw ͢ͰʹUSVOLʹNFSHF͞ΕͯΔw ·ͩ·ͩߥΓ͚ͩͲɺҰ෦ͷϕϯνϚʔΫͰܶతͳվળ͕ݟΒΕΔw 3VCZY࣮ݱʹ͚ͯண࣮ʹਐาͯ͠Δʂ
©2018 Wantedly, Inc. 3VCZͷ+*5ͱ 3VCZͷ+*5Λࢼͯ͠ΈΔ ·ͱΊ ͓·͚ࠓ͢༰
©2018 Wantedly, Inc.ࢿྉஔw 5IFNFUIPE+*5DPNQJMFSGPS3VCZw IUUQTNFEJVNDPN!LLVCVOUIFNFUIPEKJUDPNQJMFSGPSSVCZFFDw +*5ίϯύΠϥͷ࣮ࡍͷಈ࡞w IUUQXXXPSBDMFDPNXFCGPMEFSUFDIOFUXPSLKQKBWBNBHB[JOF+BWB."+*5QEG