Refinementsのメソッド定義を4000倍速くした話
by
alpaca-tc
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
@alpaca_tc 3FGJOFNFOUTͷϝιουఆٛ Λഒͨ͘͠ ͳ͕Β3VCZձٞ
Slide 2
Slide 2 text
アルパカ隊長 ͳ͕Β3VCZձٞ 県立岐阜商業高等学校卒 work at COBOL
Slide 3
Slide 3 text
ࠓ͢͜ͱ ɾ3VCZຊମͷ3F fi OFNFOUTΛߴԽͨ͠Ұ࿈ͷྲྀΕ ɹɾSF fi OF 4USJOH \EFGGPPOJM^ ɾ3BJMTΤϯδχΞͰ3VCZʹߩݙͰ͖Δ
Slide 4
Slide 4 text
ΞδΣϯμ ύϑΥʔϚϯεྼԽͷൃݟ ݪҼௐࠪ վળΞϓϩʔν 3BJMT։ൃऀ͕ಘֶͨͼ
Slide 5
Slide 5 text
ύϑΥʔϚϯεྼԽͷൃݟ
Slide 6
Slide 6 text
3VCZόʔδϣϯΞοϓޙ ϩʔΧϧͷ3BJMT͕͍
Slide 7
Slide 7 text
ਪଌ͢ΔͳɺܭଌͤΑ # Gemfile gem 'vernier' # config/application.rb # 計測用のmiddlewareを追加 config.middleware.use(Vernier::Middleware) # ファイルを更新してRailsのリロード処理を行う $ touch app/controllers/application_controller.rb $ curl http://localhost:3000/?vernier=true
Slide 8
Slide 8 text
3VCZNT 3VCZNT
Slide 9
Slide 9 text
3VCZNT 3VCZNT
Slide 10
Slide 10 text
࠶ݱίʔυϕϯνϚʔΫ mod = Module.new klass = Class.new Benchmark.ips do |x| x.report(RUBY_VERSION) do mod.send(:refine, klass) { def call = nil } end x.compare! end
Slide 11
Slide 11 text
ϕϯνϚʔΫ݁Ռ 10^2 10^4 10^5 10^7 3.2 3.3 3.4 3.5 3322714 i/s 713 i/s 470 i/s 442 i/s 4656x slower 7060x slower 7505x slower
Slide 12
Slide 12 text
ݪҼௐࠪ
Slide 13
Slide 13 text
👀SVCZSVCZ ͰSFGJOFʹؔ࿈͢ΔDBMMDBDIFͷແޮԽॲཧ͕Ճ͞Εͨɻ ͋ͱͰղઆ͢Δ🤥
Slide 14
Slide 14 text
ͱΓ͋͑ͣ3FWFSUύον $ echo '--- a/vm_method.c +++ b/vm_method.c @@ -304 +303,0 @@ rb_clear_method_cache(VALUE klass_or_module, ID mid) - rb_clear_all_refinement_method_cache(); ' | rbenv install 3.3.9 —patch վળ💪
Slide 15
Slide 15 text
DBMMDBDIFͷແޮԽॲཧͰ ύϑΥʔϚϯε͕ѱ͘ͳΔͷͳ͔ͥʁ
Slide 16
Slide 16 text
VTFSEVQ User Object Kernel BasicObject ܧঝνΣʔϯ Kernel#dup DBMMDBDIFͱԿ͔ w ϝιουΛݺͿ w ܧঝνΣʔϯ͔Βϝ ιουఆٛΛ୳͢
Slide 17
Slide 17 text
VTFSEVQ User Object Kernel BasicObject ܧঝνΣʔϯ Kernel#dup Kernel#dup DBMMDBDIF DBMMDBDIFͱԿ͔ w ϝιουΛݺͿ w ܧঝνΣʔϯ͔Βϝ ιουఆٛΛ୳͢ w ୳ࡧ݁ՌΛΩϟογ ϡ
Slide 18
Slide 18 text
VTFSEVQ User Object Kernel BasicObject Kernel#dup Kernel#dup User#dup DBMMDBDIF ܧঝνΣʔϯ w ϝιουΛՃ w 6TFSEVQΛࢀর͠ ͍ͨ ແޮԽॲཧͷඞཁੑ
Slide 19
Slide 19 text
VTFSEVQ User Object Kernel BasicObject Kernel#dup Kernel#dup User#dup DBMMDBDIF ܧঝνΣʔϯ ❌ w ϝιουΛՃ w 6TFSEVQΛࢀর͠ ͍ͨ w ݹ͍DBMMDBDIFΛഁغ ͢Δૢ࡞ ແޮԽॲཧͷඞཁੑ
Slide 20
Slide 20 text
0CKFDU4QBDF ϝϞϦཧɾ($
Slide 21
Slide 21 text
0CKFDU4QBDF Kernel#dup Refined#m User#created_at User#email Kernel#tap Enumerable#max Refined#x DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF
Slide 22
Slide 22 text
0CKFDU4QBDF Kernel#dup Refined#m User#created_at User#email Kernel#tap Enumerable#max Refined#x DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF ❌ ❌ 3FGJOFNFOUTؔ࿈ͷ DBMMDBDIFΛফ͢
Slide 23
Slide 23 text
0CKFDU4QBDF Kernel#dup DBMMDBDIF User#email DBMMDBDIF Enumerable#map DBMMDBDIF Kernel#tap DBMMDBDIF String("…") String("…") 1000 2 <#User …> <#Item …> Array<> <#Item …> 3209 User#email DBMMDBDIF Array<> String("…") String("…") String("…") String("…") 1234 <#Item …> <#Item …> <#Item …> ʜ
Slide 24
Slide 24 text
SFGJOFͷDBMMDBDIFແޮԽॲཧͷΦʔόʔϔου 3F fi OFͷϝιουఆٛճ ✖ 0CKFDU4QBDFͷΦϒδΣΫτ 🟰ԯΦϒδΣΫτͷࠪ ճ ສ
Slide 25
Slide 25 text
վળΞϓϩʔν
Slide 26
Slide 26 text
3VCZ*TTVF5SBDLJOH4ZTUFNʹىථ w SVCZSVCZͷXJLJʹߘΨΠυ w ࠶ݱίʔυͱௐࠪ݁ՌΛఴ͑ ͯىථ
Slide 27
Slide 27 text
CZSPPU͞Μ ʮSFGJOFͷDBMMDBDIF͚ͩ ֨ೲͯࠪ͢͠Ε͘ͳΔʯ
Slide 28
Slide 28 text
SF fi OFDBMMDBDIFઐ༻ RefinedA#dup RefinedA#size RefinedB#a RefinedC#email RefinedD#tap RefinedA#max RefinedD#map DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF DBMMDBDIF Kernel#dup String("…") User#created_at 1000 1010 String("…") Refined#map DBMMDBDIF DBMMDBDIF DBMMDBDIF … 500万オブジェクト 最小限 0CKFDU4QBDF /&8
Slide 29
Slide 29 text
💪
Slide 30
Slide 30 text
Slide 31
Slide 31 text
$IBU(15
Slide 32
Slide 32 text
w $ݴޠͷղઆᘳ w ྨࣅه๏ֶΔ w SVCZSVCZͷίʔυ ͪΐͬͱ͔Δ w ίʔυੜμϝ
Slide 33
Slide 33 text
Slide 34
Slide 34 text
IUUQTHJUIVCDPNLPSVCZIBDLDIBMMFOHF
Slide 35
Slide 35 text
Slide 36
Slide 36 text
Ϛʔδ͞Ε·ͨ͠🎉
Slide 37
Slide 37 text
मਖ਼ޙϕϯνϚʔΫ݁Ռ 10^2 10^4 10^5 10^7 3.3.9 3.3.9-patch 3.5.0 3.5.0-patch 713 i/s 442 i/s 2764x faster 4003x faster 2855003 i/s 1222135 i/s
Slide 38
Slide 38 text
3BJMT։ൃऀ͕ಘֶͨͼ
Slide 39
Slide 39 text
ᶃύϑΥʔϚϯεվળͷྲྀΕಉ͡ w ීஈͷΞϓϦέʔγϣϯͷվળͱҰॹ w ܭଌɺ࠶ݱɺվળ w ͔ͩΒɺ3BJMT։ൃऀͰߩݙͰ͖ͨ
Slide 40
Slide 40 text
ᶄ"*ίϛϡχςΟͷॿ͚ΛಘͯߩݙͰ͖Δ w "*ͱฒͯ͠$ݴޠΛֶͨ w LPSVCZIBDLDIBMMFOHFͳͲͷڭࡐ w SVCZKQ3VCZ*TTVF5SBDLJOH4ZTUFNͰΞ υόΠεΛ͍͚ͨͩͨ
Slide 41
Slide 41 text
ᶅ3VCZ,BJHJͷ͕ࣝ׆͖Δ w ($ͰηάϑΥˠ($DPNQBDUJPOʹΑΔΞ υϨε࠶ஔ! w ڞ༗σʔλΞΫηεʹϩοΫˠ(MPCBM7. -PDL! w ϓϩϑΝΠϥˠWFOJFS!
Slide 42
Slide 42 text
͓ΘΓʹ
Slide 43
Slide 43 text
No content
Slide 44
Slide 44 text
3BJMTΤϯδχΞͰ ίϯτϦϏϡʔτͰ͖ͨ ࣍ɺ͋ͳͨͷ൪ɻ