Refinementsのメソッド定義を4000倍速くした話
by
alpaca-tc
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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ΤϯδχΞͰ ίϯτϦϏϡʔτͰ͖ͨ ࣍ɺ͋ͳͨͷ൪ɻ