Slide 1

Slide 1 text

!OFLPXFO ݈߁ୈҰʂ .FUSJD,JUͰ࢝ΊΔΞϓϦͷ݈߁਍அ J04%$+BQBO%BZ 5SBDL#ʙ

Slide 2

Slide 2 text

ࣗݾ঺հ OFLPXFO ωί΢Σϯ  4503&4גࣜձࣾͰ4503&4ϨδΞϓϦΛ ։ൃ͍ͯ͠·͢ Ͷ͕͜޷͖🐈 9!OLXO

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

ΞδΣϯμ w ΞϓϦͷύϑΥʔϚϯεͱ͸ w .FUSJD,JUͱ͸ͳΜͳͷ͔ɺԿ͕Θ͔Δͷ͔ w 4503&4Ͱ.FUSJD,JUΛ࢖ͬͨࣄྫ w ·ͱΊ

Slide 5

Slide 5 text

ΞϓϦͷύϑΥʔϚϯεվળ ΍ͬͯ·͔͢ʁ🖐

Slide 6

Slide 6 text

ΞϓϦύϑΥʔϚϯεͱ͸ ओʹύϑΥʔϚϯεࢦඪͱͳΔͷ͸͜ͷͭ w Ԡ౴ੑ w ΞϓϦͷىಈ࣌ؒ w ϝϞϦͷ࢖༻ྔ w όοςϦʔޮ཰ ࢀߟ4VSWJWBMHVJEFUPBQQMJDBUJPOQFSGPSNBODF IUUQTEFWFMPQFSBQQMFDPNKQWJEFPTQMBZXXED

Slide 7

Slide 7 text

Ԡ౴ੑ w λοϓ΍δΣενϟʔʹରͯ͠ଈ࠲ʹΞϓϦ͕Ԡ౴͢Δ͜ͱͰɺϢʔβʔ͸ը ໘্ͷΦϒδΣΫτΛ௚઀ૢ࡞͍ͯ͠Δײ֮ΛಘΒΕΔ w ॲཧʹ஗Ԇ͕ൃੜ͢Δͱɺը໘͕ϑϦʔζͨ͠ΓɺΞχϝʔγϣϯ΍ભҠ͕ ෆࣗવʹඈΜͰ͍ΔΑ͏ʹݟ͑Δ ˠϢʔβʔͷϑϥετϨʔγϣϯ͕ཷ·ΔՄೳੑ͕͋Δ

Slide 8

Slide 8 text

ΞϓϦͷىಈ࣌ؒ w ΞϓϦͷىಈ࣌ؒϢʔβʔ͕ΞΠίϯΛλοϓ͔ͯ͠Β6*͕දࣔ͞ΕΔ·Ͱ w ىಈʹ͕͔͔࣌ؒΔΞϓϦ͸ϢʔβʔͷϑϥετϨʔγϣϯΛཷΊΔ w ͋·Γʹ͕͔͔࣌ؒΔͱXBUDIEPH γεςϜͷ؂ࢹϓϩηε ʹΑͬͯڧ੍ऴ ྃ͞ΕΔՄೳੑ͕͋Δ

Slide 9

Slide 9 text

ϝϞϦ࢖༻ྔ w σόΠεͷϝϞϦ͸γεςϜશମͰڞ༗͞ΕΔ༗ݶϦιʔε w ΞϓϦ͕࢖͑ΔϝϞϦͷ্ݶ஋͸γεςϜʹΑܾͬͯΊΒΕ͍ͯΔ w ্ݶ஋Λ௒͑Δͱڧ੍ऴྃ͞ΕΔ w όοΫάϥ΢ϯυ 4VTQFOEFE ͷঢ়ଶͰར༻ՄೳͳϝϞϦ͕গͳ͍৔߹ γεςϜʹΑͬͯڧ੍ऴྃ͞ΕΔ͜ͱ͕͋Δ

Slide 10

Slide 10 text

όοςϦʔޮ཰ w ωοτϫʔΫ௨৴ɺίʔυ࣮ߦɺϋʔυ΢ΣΞͷ੍ޚͳͲ͋ΒΏΔ৔໘Ͱి ྗ͕ফඅ͞ΕΔ w େྔʹωοτϫʔΫ௨৴ΛߦͬͨΓɺ$16ΛϑϧՔಇͤ͞Δͱͦͷ෼ిྗΛ ଟ͘ফඅ͢Δ w ిྗফඅ͕େ͖͍ͱॆి࢒ྔ͕ૣ͘ݮΓɺॆి·Ͱͷظؒ΋୹͘ͳΔ

Slide 11

Slide 11 text

ύϑΥʔϚϯε৘ใͷऩूखஈ w 9DPEF0SHBOJ[FSΛ࢖͏ w .FUSJD,JUΛ࢖͏ w ֎෦αʔϏεΛར༻͢Δ w 'JSFCBTF1FSGPSNBODF.POJUPSJOH

Slide 12

Slide 12 text

9DPEF0SHBOJ[FS .FUSJDT 9DPEF8JOEPX0SHBOJ[FS w 🙆ઃఆෆཁ w 🙆ىಈ࣌ؒɺԠ౴ੑɺϝϞϦ΍όοςϦʔޮ ཰ͳͲύϑΥʔϚϯεσʔλ͕ՄࢹԽͰ͖Δ w 🙆όʔδϣϯ͝ͱͷύϑΥʔϚϯεͷൺֱ͕ Մೳ w 🙅5FTU'MJHIUͰ͸ूܭ͞Εͳ͍

Slide 13

Slide 13 text

.FUSJD,JU J04σόΠε্ͰΞϓϦͷύϑΥʔϚϯε΍ిྗফ අʹؔ͢Δੑೳ΍਍அσʔλΛऩू͢ΔϑϨʔϜ ϫʔΫ w 🙆ಋೖ͕ൺֱత؆୯ w 🙆ऩूͨ͠σʔλΛ؂ࢹαʔϏε $SBTIMZUJDT ͳͲ ΍ࣗࣾαʔόʔʹू໿Ͱ͖Δ w 🙆ΧελϜΠϕϯτͷ௥Ճ͕Մೳ w 🙅ϝτϦΫεΛऩू͢ΔͨΊͷ"1*͕ඞཁ

Slide 14

Slide 14 text

'JSFCBTF1FSGPSNBODF.POJUPSJOH 'JSFCBTF͕ఏڙ͢ΔϞχλϦϯάπʔϧ w 🙆4%,ͷಋೖ͕؆୯ w 🙆ҎԼͷσʔλ͕ࣗಈతʹऩू͞ΕΔ w ΞϓϦͷىಈ࣌ؒ w ը໘ͷϨϯμϦϯάύϑΥʔϚϯε w )5514௨৴ͷϦΫΤετσʔλ w 🙆ΧελϜΠϕϯτͷ௥Ճ͕Մೳ w 🙅ৄࡉͳύϑΥʔϚϯεσʔλ͸ݟΕͳ͍

Slide 15

Slide 15 text

9DPEF0SHBOJ[FS .FUSJD,JU "1* 'JSFCBTF1FSGPSNBODF .POJUPSJOH ಋೖͷखؒ ಋೖෆཁ .FUSJD,JUͷJNQPSU ؆୯ͳ࣮૷ 4%,ͷ௥Ճ ॳظԽ ΧελϚΠζ ͳ͠ 3FHSFTTJPOTͷΈ௨஌Մ ؂ࢹαʔϏε΍"1*ʹґଘ ࢦඪ͓ΑͼΞϥʔτͷઃఆ͕Մೳ "1*෼ੳج൫ͷ४උ ෆཁ ඞཁ ෆཁ 5FTU'MJHIUͰ ར༻Մೳ͔ Ͱ͖ͳ͍ Ͱ͖Δ Ͱ͖Δ ऩूͰ͖Δ৘ใ ΞϓϦͷىಈ࣌ؒ Ԡ౴ੑ ϝϞϦ΍όοςϦʔޮ཰ ͳͲ ΞϓϦͷىಈ࣌ؒ Ԡ౴ੑ ϝϞϦ΍όοςϦʔޮ཰ ΧελϜΠϕϯτ ͳͲ ΞϓϦͷىಈ࣌ؒ ը໘ͷϨϯμϦϯάύϑΥʔϚϯε )5514௨৴ͷϦΫΤετσʔλ ΧελϜΠϕϯτ

Slide 16

Slide 16 text

ύϑΥʔϚϯε৘ใΛͲͷΑ͏ʹऩू͢Δ͔ w αΫοͱݱঢ়ϦϦʔε͞Ε͍ͯΔΞϓϦͷύϑΥʔϚϯεΛݟ͍ͨ৔߹͸ 9DPEF0SHBOJ[FS͕ྑ͍ w طʹ؂ࢹαʔϏεΛར༻͍ͯ͠Ε͹ɺ.FUSJD,JUΛ࢖ͬͯσʔλΛू໿͢Δ w ஔ͖৔ॴ͸ͪΐͬͱߟ͑Δඞཁ͕͋Δ

Slide 17

Slide 17 text

.FUSJD,JUʹ͍ͭͯ

Slide 18

Slide 18 text

.FUSJD,JUʹ͍ͭͯ .FUSJD,JU͸େ͖͘छྨͷσʔλΛѻ͏ w ϝτϦΫε w γεςϜ͕Ωϟϓνϟͨ͠ύϑΥʔϚϯε΍όοςϦʔޮ཰ͱ͍ͬͨσʔλ ͕ఆྔԽՃ޻͞Ε͍ͯΔ w ਍அσʔλ w ύϑΥʔϚϯεվળ΍ෆ۩߹मਖ਼ͷͨΊͷσόοά৘ใؚ͕·ΕΔ

Slide 19

Slide 19 text

શମߏ੒ ϝτϦΫεΛ4VCTDSJCF͠ɺύϑΥʔϚϯε৘ใͷऩूΛ·ͭ ϝτϦΫεΛड͚औΔ αʔόʔ΍؂ࢹαʔϏε

Slide 20

Slide 20 text

શମߏ੒ γεςϜ͔ΒϝτϦΫεΛؚΉ1BZMPBE͕౉͞ΕΔ ϝτϦΫεΛड͚औΔ αʔόʔ΍؂ࢹαʔϏε

Slide 21

Slide 21 text

શମߏ੒ ϝτϦΫεΛड͚औΔ αʔόʔ΍؂ࢹαʔϏε σʔλΛ੔ܗ͠ɺαʔόʔ΁ૹΔ

Slide 22

Slide 22 text

ϝτϦΫε͕ड͚औΕΔλΠϛϯά w ೔࣍೔࠷େճ w ΞϓϦΛىಈ͓͓ͯ͠Αͦ೔ޙ͔Βड͚औΕΔ w ΞϓϦ͕ͦͷ೔શ͘࢖ΘΕͳ͍ͱϝτϦΫε͕߱ͬͯ͜ͳ͍͜ͱ͕͋Δ

Slide 23

Slide 23 text

਍அσʔλ͕ड͚औΕΔλΠϛϯά w ೔࣍೔࠷େճ w J04 NBD04Ҏ߱Ͱ͋Ε͹ଈ࣌ʹड͚औΕΔ

Slide 24

Slide 24 text

.9.FUSJD.BOBHFS w ओʹϝτϦΫεͷ4VCTDSJCFΛ؅ཧ͢ΔΫϥε w ڞ༗ΠϯελϯεͰ͋ΔTIBSFEΛॳΊͯݺͼग़͢ͱ ύϑΥʔϚϯεσʔλͷ஝ੵ͕ߦΘΕΔ

Slide 25

Slide 25 text

ϝτϦΫεΛड͚औΔ class AppDelegate: NSObject, UIApplicationDelegate, MXMetricManagerSubscriber { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { MXMetricManager.shared.add(self) return true } func didReceive(_ payloads: [MXMetricPayload]) { } func didReceive(_ payloads: [MXDiagnosticPayload]) { } }

Slide 26

Slide 26 text

ϝτϦΫεΛड͚औΔ class AppDelegate: NSObject, UIApplicationDelegate, MXMetricManagerSubscriber { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { MXMetricManager.shared.add(self) return true } func didReceive(_ payloads: [MXMetricPayload]) { } func didReceive(_ payloads: [MXDiagnosticPayload]) { } } .9.FUSJD.BOBHFS4VCTDSJCFSʹ४ڌ͢Δ

Slide 27

Slide 27 text

ϝτϦΫεΛड͚औΔ class AppDelegate: NSObject, UIApplicationDelegate, MXMetricManagerSubscriber { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { MXMetricManager.shared.add(self) return true } func didReceive(_ payloads: [MXMetricPayload]) { } func didReceive(_ payloads: [MXDiagnosticPayload]) { } } EJE3FDFJWFϝιουΛఆٛ

Slide 28

Slide 28 text

ϝτϦΫεΛड͚औΔ class AppDelegate: NSObject, UIApplicationDelegate, MXMetricManagerSubscriber { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { MXMetricManager.shared.add(self) return true } func didReceive(_ payloads: [MXMetricPayload]) { } func didReceive(_ payloads: [MXDiagnosticPayload]) { } } ϝτϦΫε͕४උͰ͖ͨͱ͖ʹݺ͹ΕΔ

Slide 29

Slide 29 text

ϝτϦΫεΛड͚औΔ class AppDelegate: NSObject, UIApplicationDelegate, MXMetricManagerSubscriber { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { MXMetricManager.shared.add(self) return true } func didReceive(_ payloads: [MXMetricPayload]) { } func didReceive(_ payloads: [MXDiagnosticPayload]) { } } ਍அσʔλ͕४උͰ͖ͨͱ͖ʹݺ͹ΕΔ

Slide 30

Slide 30 text

ϝτϦΫεΛड͚औΔ class AppDelegate: NSObject, UIApplicationDelegate, MXMetricManagerSubscriber { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { MXMetricManager.shared.add(self) return true } func didReceive(_ payloads: [MXMetricPayload]) { payloads.forEach { printMetricPayload($0) } } func didReceive(_ payloads: [MXDiagnosticPayload]) { payloads.forEach { printDiagnosticPayload($0) } } } .9.FUSJD.BOBHFSBEE @ ΛݺͿ

Slide 31

Slide 31 text

ಈ࡞֬ೝ w γϛϡϨʔλ্Ͱ͸ར༻ෆՄɺ࣮ػ͕ඞཁ w 9DPEF%FCVH4JNVMBUF.FUSJD,JU 1BZMPBETΛΫϦοΫ͢Δ w EJE3FDFJWFϝιου͕ݺ͹ΕΔ͜ͱΛ֬ೝ w ͨ·ʹݺ͹Εͳ͔ͬͨΓݺ͹ΕΔ·Ͱϥά ͕͋ΔͷͰͦͷ৔߹͸Կ౓͔ΞϓϦ࠶ىಈ Λࢼͯ͠Έ͍ͯͩ͘͞🙏

Slide 32

Slide 32 text

ϝτϦΫεΛ֎෦΁ૹ৴͢Δ w ૹΓઌ͸ϓϩμΫτͰ࢖༻͍ͯ͠Δ؂ࢹαʔϏε΍෼ੳج൫ʹ߹Θͤͯ࢖͏ ͷ͕ྑ͍Ͱ͢ w $SBTIMZUJDT %BUBEPHͳͲ w ޙ൒ͷࣄྫͰͲͷΑ͏ʹૹ͍ͬͯΔ͔͓࿩͠͠·͢🙏

Slide 33

Slide 33 text

.FUSJD,JUͰಘΒΕΔ৘ใͱ͸

Slide 34

Slide 34 text

$FMMVBS$POEJUJPO.FUSJDT $16.FUSJDT %JTQMBZ.FUSJDT (16.FUSJDT -PDBUJPO"DUJWJUZ.FUSJDT /FUXPSL5SBOTGFS.FUSJDT "QQMJDBUJPO&YJU.FUSJDT "QQMJDBUJPO-BVODI.FUSJDT "OJNBUJPO.FUSJDT "QQMJDBUJPO3FTQPOTJWFOFTT.FUSJDT %JTL*0.FUSJDT 4JHO1PTU.FUSJDT .FNPSZ.FUSJDT "QQMJDBUJPO5JNF.FUSJDT

Slide 35

Slide 35 text

ϝτϦΫεͷछྨ w όοςϦʔফඅʹؔ͢ΔϝτϦΫε w ύϑΥʔϚϯεʹؔ͢ΔϝτϦΫε w σΟεΫͷಡΈॻ͖ʹؔ͢ΔϝτϦΫε

Slide 36

Slide 36 text

όοςϦʔফඅʹؔ͢ΔϝτϦΫε w $16(16ͷ࢖༻࣌ؒ w ༗ػ&-σΟεϓϨΠͷฏۉతͳ໌Δ͞ w Ґஔ৘ใͷਫ਼౓ผऔಘ࣌ؒ w ܞଳճઢͷి೾ڧ౓ w ωοτϫʔΫసૹྔ ܞଳճઢ8J'J

Slide 37

Slide 37 text

ύϑΥʔϚϯεʹؔ͢ΔϝτϦΫε w ΞϓϦͷىಈ࣌ؒ w ΞϓϦͷऴྃཧ༝ͱͦͷճ਺ w ΞϓϦ͕4VTQFOEFEͷ࣌ͷฏۉϝϞϦ࢖༻ྔ࠷େϝϞϦ࢖༻ྔ

Slide 38

Slide 38 text

σΟεΫͷಡΈॻ͖ʹؔ͢ΔϝτϦΫε w σΟεΫ·ͨ͸ετϨʔδʹॻ͖ࠐ·Εͨσʔλͷ߹ܭྔ

Slide 39

Slide 39 text

ͲΕ͔ΒݟͨΒ ྑ͍ͷ͔Θ͔Βͳ͍ʜ😔

Slide 40

Slide 40 text

ݟ͓ͯ͘΂͖؍఺ w ΞϓϦͷىಈ͕࣌ؒ৳ͼ͍ͯͳ͍͔ w ΞϓϦ͕ҟৗऴ͍ྃͯ͠ͳ͍͔ w ΞϓϦ͕ϋϯά͍ͯ͠ͳ͍͔

Slide 41

Slide 41 text

࠶ܝ ΞϓϦͷىಈ࣌ؒ w ΞϓϦͷىಈ࣌ؒϢʔβʔ͕ΞΠίϯΛλοϓ͔ͯ͠Β6*͕දࣔ͞ΕΔ·Ͱ w ىಈʹ͕͔͔࣌ؒΔΞϓϦ͸ϢʔβʔͷϑϥετϨʔγϣϯΛཷΊΔ w ͋·Γʹ͕͔͔࣌ؒΔͱXBUDIEPH γεςϜͷ؂ࢹϓϩηε ʹΑͬͯڧ੍ऴ ྃ͞ΕΔՄೳੑ͕͋Δ

Slide 42

Slide 42 text

.9"QQ-BVODI.FUSJD w ΞϓϦͷىಈ࣌ؒͷώετάϥϜ͕औಘͰ͖Δ

Slide 43

Slide 43 text

.9"QQ-BVODI.FUSJD w ΞϓϦͷىಈ࣌ؒͷώετάϥϜ͕औಘͰ͖Δ w IJTUPHSBNNFE0QUJNJ[FE5JNF5P'JSTU%SBX w IJTUPHSBNNFE5JNF5P'JSTU%SBX

Slide 44

Slide 44 text

.9"QQ-BVODI.FUSJD w ΞϓϦͷىಈ࣌ؒͷώετάϥϜ͕औಘͰ͖Δ w IJTUPHSBNNFE0QUJNJ[FE5JNF5P'JSTU%SBX w IJTUPHSBNNFE5JNF5P'JSTU%SBX w IJTUPHSBNNFE"QQMJDBUJPO3FTVNF5JNF

Slide 45

Slide 45 text

ൃੜස౓      ىಈ࣌ؒ NT    { "applicationLaunchMetrics" : { "histogrammedTimeToFirstDrawKey" : { "histogramNumBuckets" : 3, "histogramValue" : { "0" : { "bucketCount" : 5, "bucketStart" : "80 ms", "bucketEnd" : "89 ms" }, "1" : { "bucketCount" : 2, "bucketStart" : "150 ms", "bucketEnd" : "159 ms" }, "2" : { "bucketCount" : 1, "bucketStart" : "6990 ms", "bucketEnd" : "6999 ms" } } } } } ࠾औͨ͠σʔλ άϥϑԽͨ͠΋ͷ

Slide 46

Slide 46 text

{ "applicationLaunchMetrics" : { "histogrammedTimeToFirstDrawKey" : { "histogramNumBuckets" : 3, "histogramValue" : { "0" : { "bucketCount" : 5, "bucketStart" : "80 ms", "bucketEnd" : "89 ms" }, "1" : { "bucketCount" : 2, "bucketStart" : "150 ms", "bucketEnd" : "159 ms" }, "2" : { "bucketCount" : 1, "bucketStart" : "6990 ms", "bucketEnd" : "6999 ms" } } } } } ࠾औͨ͠σʔλ άϥϑԽͨ͠΋ͷ ൃੜස౓      ىಈ࣌ؒ NT   

Slide 47

Slide 47 text

{ "applicationLaunchMetrics" : { "histogrammedTimeToFirstDrawKey" : { "histogramNumBuckets" : 3, "histogramValue" : { "0" : { "bucketCount" : 5, "bucketStart" : "80 ms", "bucketEnd" : "89 ms" }, "1" : { "bucketCount" : 2, "bucketStart" : "150 ms", "bucketEnd" : "159 ms" }, "2" : { "bucketCount" : 1, "bucketStart" : "6990 ms", "bucketEnd" : "6999 ms" } } } } } ࠾औͨ͠σʔλ άϥϑԽͨ͠΋ͷ ൃੜස౓      ىಈ࣌ؒ NT   

Slide 48

Slide 48 text

ݟ͓ͯ͘΂͖؍఺ w ✅ΞϓϦͷىಈ͕࣌ؒ৳ͼ͍ͯͳ͍͔ w ΞϓϦ͕ҟৗऴ͍ྃͯ͠ͳ͍͔ w ΞϓϦ͕ϋϯά͍ͯ͠ͳ͍͔

Slide 49

Slide 49 text

Ҿ༻3FEVDJOHUFSNJOBUJPOTJOZPVSBQQ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOYDPEFSFEVDFUFSNJOBUJPOTJOZPVSBQQ6OEFSTUBOEUFSNJOBUJPOSFBTPOT ཧ༝ ݪҼ Ϋϥογϡ ηάϝϯςʔγϣϯҧ൓ɾෆਖ਼ͳ໋ྩɾ BTTFSU͓ΑͼΩϟον͞Ε͍ͯͳ͍ྫ֎͕ൃੜͨ͠ 8BUDIEPHʹΑΔ΋ͷ ىಈ͓ΑͼόοΫάϥ΢ϯυɾϑΥΞάϥ΢ϯυ ͷભҠॲཧʹ͕͔͔࣌ؒΓ͗ͨ͢ $16࢖༻੍ݶ $16ෛՙ͕ߴ͍ঢ়ଶ͕ଓ͍ͨ ϝϞϦ࢖༻੍ݶ ϝϞϦ࢖༻ྔ͕γεςϜͷ੍ݶ஋Λ௒͑ͨ ϝϞϦෆ଍ +FUTBN γεςϜ͕ΑΓଟ͘ͷϝϞϦྖҬΛඞཁͱ͢ΔͨΊ όοΫάϥ΢ϯυͷΞϓϦΛऴྃͨ͠ #BDLHSPVOE5BTL ͷλΠϜΞ΢τ #BDLHSPVOE5BTLʹׂΓ౰ͯΒΕ͍ͯΔ࣮ߦ࣌ؒΛ௒͑ͨ ϑΝΠϧϩοΫ "QQ(SPVQTͷڞ༗ϑΝΠϧͷϩοΫΛอ࣋͠ଓ͚ͨ

Slide 50

Slide 50 text

.9"QQ&YJU.FUSJD w ΞϓϦ͕ϑΥΞάϥ΢ϯυόοΫάϥ΢ϯυͰऴྃͨ͠ྦྷੵ਺͕ه࿥͞Εͯ ͍Δ w GPSFHSPVOE&YJU%BUB w CBDLHSPVOE&YJU%BUB

Slide 51

Slide 51 text

.9"QQ&YJU.FUSJD w DVNVMBUJWF/PSNBM"QQ&YJU$PVOU w ΞϓϦ͕௨ৗऴྃͨ͠ྦྷੵճ਺ w DVNVMBUJWF"COPSNBM&YJU$PVOU w ΞϓϦ͕ҟৗऴྃͨ͠ྦྷੵճ਺

Slide 52

Slide 52 text

ཧ༝ ϓϩύςΟ Ϋϥογϡ DVNVMBUJWF#BE"DDFTT&YJU$PVOU DVNVMBUJWF*MMFHBM*OTUSVDUJPO&YJU$PVOU 8BUDIEPHʹΑΔ΋ͷ DVNVMBUJWF"QQ8BUDIEPH&YJU$PVOU $16࢖༻੍ݶ DVNVMBUJWF$163FTPVSDF-JNJU&YJU$PVOU ϝϞϦ࢖༻੍ݶ DVNVMBUJWF.FNPSZ3FTPVSDF-JNJU&YJU$PVOU ϝϞϦෆ଍ +FUTBN DVNVMBUJWF.FNPSZ1SFTTVSF&YJU$PVOU #BDLHSPVOE5BTL ͷλΠϜΞ΢τ DVNVMBUJWF#BDLHSPVOE5BTL"TTFSUJPO5JNFPVU&YJU$PVOU ϑΝΠϧϩοΫ DVNVMBUJWF4VTQFOEFE8JUI-PDLFE'JMF&YJU$PVOU

Slide 53

Slide 53 text

ཧ༝ ϓϩύςΟ Ϋϥογϡ DVNVMBUJWF#BE"DDFTT&YJU$PVOU DVNVMBUJWF*MMFHBM*OTUSVDUJPO&YJU$PVOU 8BUDIEPHʹΑΔ΋ͷ DVNVMBUJWF"QQ8BUDIEPH&YJU$PVOU $16࢖༻੍ݶ DVNVMBUJWF$163FTPVSDF-JNJU&YJU$PVOU ϝϞϦ࢖༻੍ݶ DVNVMBUJWF.FNPSZ3FTPVSDF-JNJU&YJU$PVOU ϝϞϦෆ଍ +FUTBN DVNVMBUJWF.FNPSZ1SFTTVSF&YJU$PVOU #BDLHSPVOE5BTL ͷλΠϜΞ΢τ DVNVMBUJWF#BDLHSPVOE5BTL"TTFSUJPO5JNFPVU&YJU$PVOU ϑΝΠϧϩοΫ DVNVMBUJWF4VTQFOEFE8JUI-PDLFE'JMF&YJU$PVOU

Slide 54

Slide 54 text

ݟ͓ͯ͘΂͖؍఺ w ✅ΞϓϦͷىಈ͕࣌ؒ৳ͼ͍ͯͳ͍͔ w ✅ΞϓϦ͕γεςϜʹΑͬͯऴྃ͞Ε͍ͯͳ͍͔ w ΞϓϦ͕ϑϦʔζ͍ͯ͠ͳ͍͔

Slide 55

Slide 55 text

.9"QQ3FTQPOTJWFOFTT.FUSJD w Ϣʔβʔૢ࡞ʹର͢ΔԠ౴ੑͷࢦඪΛද͢ w IJTUPHSBNNFE"QQMJDBUJPO)BOH5JNF

Slide 56

Slide 56 text

IJTUPHSBNNFE"QQMJDBUJPO)BOH5JNF w ϋϯά͸΄ͱΜͲͷ৔߹ɺϝΠϯεϨουͰͷॏ͍ॲཧ͕ݪҼ w ॲཧʹNTҎ্͔͔͍ͬͯͳ͍͔ Ҿ༻*NQSPWJOHBQQSFTQPOTJWFOFTT IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOYDPEFJNQSPWJOHBQQSFTQPOTJWFOFTT

Slide 57

Slide 57 text

    ϋϯά࣌ؒ NT ʙ       ࠾औͨ͠σʔλ άϥϑԽͨ͠΋ͷ { "applicationResponsivenessMetrics" : { "histogrammedAppHangTime" : { "histogramNumBuckets" : 44, "histogramValue" : { "3" : { "bucketCount" : 2, "bucketStart" : "310 ms", "bucketEnd" : "319 ms" }, "12" : { "bucketCount" : 1, "bucketStart" : "470 ms", "bucketEnd" : "479 ms" }, "21" : { "bucketCount" : 1, "bucketStart" : "900 ms", "bucketEnd" : "909 ms" }, ... } } } }

Slide 58

Slide 58 text

    ϋϯά࣌ؒ NT ʙ       ࠾औͨ͠σʔλ άϥϑԽͨ͠΋ͷ { "applicationResponsivenessMetrics" : { "histogrammedAppHangTime" : { "histogramNumBuckets" : 44, "histogramValue" : { "3" : { "bucketCount" : 2, "bucketStart" : "310 ms", "bucketEnd" : "319 ms" }, "12" : { "bucketCount" : 1, "bucketStart" : "470 ms", "bucketEnd" : "479 ms" }, "21" : { "bucketCount" : 1, "bucketStart" : "900 ms", "bucketEnd" : "909 ms" }, ... } } } }

Slide 59

Slide 59 text

ݟ͓ͯ͘΂͖؍఺ w ✅ΞϓϦͷىಈ͕࣌ؒ௕͘ͳ͍ͬͯͳ͍͔ w ✅ΞϓϦ͕γεςϜʹΑͬͯऴྃ͞Ε͍ͯͳ͍͔ w ✅ΞϓϦ͕ϋϯά͍ͯ͠ͳ͍͔ 👍

Slide 60

Slide 60 text

4503&4ϨδͰͷ׆༻ࣄྫ

Slide 61

Slide 61 text

ΞϓϦ͕લ৮Ε΋ͳ͘ऴྃͯ͠͠·͏ w 2"νʔϜ͔Βʮಛఆͷ୺຤ͰΞϓϦΛ։͍͍ͯΔͱ೔ʹ਺ճΫϥογϡ͢ Δʯͱ͍͏ใࠂΛ΋Β͏

Slide 62

Slide 62 text

ΞϓϦ͕લ৮Ε΋ͳ͘ऴྃͯ͠͠·͏ w 2"νʔϜ͔Βʮಛఆͷ୺຤ͰΞϓϦΛ։͍͍ͯΔͱ೔ʹ਺ճΫϥογϡ͢ Δʯͱ͍͏ใࠂΛ΋Β͏ w $SBTIMZUJDTɺ5FTU'MJHIUʹΫϥογϡϩάͳ͠

Slide 63

Slide 63 text

ΞϓϦ͕લ৮Ε΋ͳ͘ऴྃͯ͠͠·͏ w 2"νʔϜ͔Βʮಛఆͷ୺຤ͰΞϓϦΛ։͍͍ͯΔͱ೔ʹ਺ճΫϥογϡ͢ Δʯͱ͍͏ใࠂΛ΋Β͏ w $SBTIMZUJDTɺ5FTU'MJHIUʹΫϥογϡϩάͳ͠ w 04ͷϩάΛΈΔͱ+FUTBNΠϕϯτ͕සൃ͍ͯͨ͠ w ͜͜ͰϝϞϦϦʔΫͷՄೳੑ͕ೱްʹ

Slide 64

Slide 64 text

ΞϓϦ͕લ৮Ε΋ͳ͘ऴྃͯ͠͠·͏ w 2"νʔϜ͔Βʮಛఆͷ୺຤ͰΞϓϦΛ։͍͍ͯΔͱ೔ʹ਺ճΫϥογϡ͢ Δʯͱ͍͏ใࠂΛ΋Β͏ w $SBTIMZUJDTɺ5FTU'MJHIUʹΫϥογϡϩάͳ͠ w 04ͷϩάΛΈΔͱ+FUTBNΠϕϯτ͕සൃ͍ͯͨ͠ w ͜͜ͰϝϞϦϦʔΫͷՄೳੑ͕ೱްʹ w ˠಛఆͷ৚݅ͰϝϞϦΛফඅ͠ଓ͚Δόά͕ݟ͔ͭͬͨ🐛

Slide 65

Slide 65 text

࠶ܝ ཧ༝ ݪҼ Ϋϥογϡ ηάϝϯςʔγϣϯҧ൓ɾෆਖ਼ͳ໋ྩɾ BTTFSU͓ΑͼΩϟον͞Ε͍ͯͳ͍ྫ֎͕ൃੜͨ͠ 8BUDIEPHʹΑΔ΋ͷ ىಈ͓ΑͼόοΫάϥ΢ϯυɾϑΥΞάϥ΢ϯυ ͷભҠॲཧʹ͕͔͔࣌ؒΓ͗ͨ͢ $16࢖༻੍ݶ $16ෛՙ͕ߴ͍ঢ়ଶ͕ଓ͍ͨ ϝϞϦ࢖༻੍ݶ ϝϞϦ࢖༻ྔ͕γεςϜͷ੍ݶ஋Λ௒͑ͨ ϝϞϦෆ଍ +FUTBN γεςϜ͕ΑΓଟ͘ͷϝϞϦྖҬΛඞཁͱ͢ΔͨΊ όοΫάϥ΢ϯυͷΞϓϦΛऴྃͨ͠ #BDLHSPVOE5BTL ͷλΠϜΞ΢τ #BDLHSPVOE5BTLʹׂΓ౰ͯΒΕ͍ͯΔ࣮ߦ࣌ؒΛ௒͑ͨ ϑΝΠϧϩοΫ "QQ(SPVQTͷڞ༗ϑΝΠϧͷϩοΫΛอ࣋͠ଓ͚ͨ

Slide 66

Slide 66 text

ࠓճͷݪҼ ཧ༝ ݪҼ Ϋϥογϡ ηάϝϯςʔγϣϯҧ൓ɾෆਖ਼ͳ໋ྩɾ BTTFSU͓ΑͼΩϟον͞Ε͍ͯͳ͍ྫ֎͕ൃੜͨ͠ 8BUDIEPHʹΑΔ΋ͷ ىಈ͓ΑͼόοΫάϥ΢ϯυɾϑΥΞάϥ΢ϯυ ͷભҠॲཧʹ͕͔͔࣌ؒΓ͗ͨ͢ $16࢖༻੍ݶ $16ෛՙ͕ߴ͍ঢ়ଶ͕ଓ͍ͨ ϝϞϦ࢖༻੍ݶ ϝϞϦ࢖༻ྔ͕γεςϜͷ੍ݶ஋Λ௒͑ͨ ϝϞϦෆ଍ +FUTBN γεςϜ͕ΑΓଟ͘ͷϝϞϦྖҬΛඞཁͱ͢ΔͨΊ όοΫάϥ΢ϯυͷΞϓϦΛऴྃͨ͠ #BDLHSPVOE5BTL ͷλΠϜΞ΢τ #BDLHSPVOE5BTLʹׂΓ౰ͯΒΕ͍ͯΔ࣮ߦ࣌ؒΛ௒͑ͨ ϑΝΠϧϩοΫ "QQ(SPVQTͷڞ༗ϑΝΠϧͷϩοΫΛอ࣋͠ଓ͚ͨ ࠓճͷݪҼ

Slide 67

Slide 67 text

ݪҼ͸Θ͔͕ͬͨʜ🤔 w ࣍ಉ͡Α͏ͳෆ۩߹͕͋ͬͨ৔߹ʹؾ͚ͮΔอূ͕ͳ͍ w 4503&4ϨδͰ͸௨৴Τϥʔ΍಺෦ΤϥʔΛඇக໋తͳΤϥʔͱͯ͠ $SBTIMZUJDTʹૹ͍ͬͯΔ ˠ.FUSJD,JUΛར༻͠$SBTIMZUJDTʹૹͬͯΈΔ

Slide 68

Slide 68 text

ཧ༝ ϓϩύςΟ Ϋϥογϡ DVNVMBUJWF#BE"DDFTT&YJU$PVOU DVNVMBUJWF*MMFHBM*OTUSVDUJPO&YJU$PVOU 8BUDIEPHʹΑΔ΋ͷ DVNVMBUJWF"QQ8BUDIEPH&YJU$PVOU $16࢖༻੍ݶ DVNVMBUJWF$163FTPVSDF-JNJU&YJU$PVOU ϝϞϦ࢖༻੍ݶ DVNVMBUJWF.FNPSZ3FTPVSDF-JNJU&YJU$PVOU ϝϞϦෆ଍ +FUTBN DVNVMBUJWF.FNPSZ1SFTTVSF&YJU$PVOU #BDLHSPVOE5BTL ͷλΠϜΞ΢τ DVNVMBUJWF#BDLHSPVOE5BTL"TTFSUJPO5JNFPVU&YJU$PVOU ϑΝΠϧϩοΫ DVNVMBUJWF4VTQFOEFE8JUI-PDLFE'JMF&YJU$PVOU

Slide 69

Slide 69 text

࣮૷

Slide 70

Slide 70 text

public enum BackgroundPerformanceError: Error { case memoryLimit(Int, Double?, Double?) public var code: Int { switch self { case .memoryLimit: return -1001 } } public var message: String { switch self { case .memoryLimit: "ϝϞϦͷ੍ݶΛ௒͑ͨͨΊΞϓϦ͕ऴྃ͠·ͨ͠" } } public var userInfo: [String: Any] { var userInfo = ["message": message] switch self { case let .memoryLimit(count, averageSuspendedMemory, peakMemoryUsage): userInfo["cumulative-count"] = "\(count)" if let averageSuspendedMemory { userInfo["average-suspended-memory"] = "\(averageSuspendedMemory)" } if let peakMemoryUsage { userInfo["peak-memory-usage"] = "\(peakMemoryUsage)" } } return userInfo } }

Slide 71

Slide 71 text

public enum BackgroundPerformanceError: Error { case memoryLimit(Int, Double?, Double?) public var code: Int { switch self { case .memoryLimit: return -1001 } } public var message: String { switch self { case .memoryLimit: "ϝϞϦͷ੍ݶΛ௒͑ͨͨΊΞϓϦ͕ऴྃ͠·ͨ͠" } } public var userInfo: [String: Any] { var userInfo = ["message": message] switch self { case let .memoryLimit(count, averageSuspendedMemory, peakMemoryUsage): userInfo["cumulative-count"] = "\(count)" if let averageSuspendedMemory { userInfo["average-suspended-memory"] = "\(averageSuspendedMemory)" } if let peakMemoryUsage { userInfo["peak-memory-usage"] = "\(peakMemoryUsage)" } } return userInfo } }

Slide 72

Slide 72 text

public enum BackgroundPerformanceError: Error { case memoryLimit(Int, Double?, Double?) public var code: Int { switch self { case .memoryLimit: return -1001 } } public var message: String { switch self { case .memoryLimit: "ϝϞϦͷ੍ݶΛ௒͑ͨͨΊΞϓϦ͕ऴྃ͠·ͨ͠" } } public var userInfo: [String: Any] { var userInfo = ["message": message] switch self { case let .memoryLimit(count, averageSuspendedMemory, peakMemoryUsage): userInfo["cumulative-count"] = "\(count)" if let averageSuspendedMemory { userInfo["average-suspended-memory"] = "\(averageSuspendedMemory)" } if let peakMemoryUsage { userInfo["peak-memory-usage"] = "\(peakMemoryUsage)" } } return userInfo } }

Slide 73

Slide 73 text

1BZMPBE͔Β&SSPSΛ࡞੒͢Δ

Slide 74

Slide 74 text

1BZMPBE͔Β&SSPSΛ࡞੒͢Δ public func didReceive(_ payloads: [MXMetricPayload]) { payloads.forEach { // ApplicationExitMetrics ؚ͕·Ε͍ͯͳ͚Ε͹εΩοϓ guard let applicationExitMetrics = $0.applicationExitMetrics else { return } let foregroundExitData = applicationExitMetrics.foregroundExitData let backgroundExitData = applicationExitMetrics.backgroundExitData … } }

Slide 75

Slide 75 text

var errors: [PerformanceError] = [] // ϝϞϦ࢖༻ྔΛKilobytesʹม׵ let averageSuspendedMemory = $0.memoryMetrics?.averageSuspendedMemory.averageMeasurement .converted(to: .kilobytes).value let peakMemoryUsage = $0.memoryMetrics?.peakMemoryUsage.converted(to: .kilobytes).value // ϑΥΞάϥ΢ϯυͰϝϞϦ੍ݶʹΑΔऴྃճ਺͕1Ҏ্͋Ε͹ه࿥͢Δ if foregroundExitData.cumulativeMemoryResourceLimitExitCount > 0 { // ͲΕ͘Β͍ͷϝϞϦΛ࢖༻͍͔ͯͨ͠΋ՄೳͰ͋Ε͹ه࿥ errors.append(.foreground(.memoryLimit( foregroundExitData.cumulativeMemoryResourceLimitExitCount, averageSuspendedMemory, peakMemoryUsage ))) } // όοΫάϥ΢ϯυͰϝϞϦ੍ݶʹΑΔऴྃճ਺͕1Ҏ্͋Ε͹ه࿥͢Δ if backgroundExitData.cumulativeMemoryResourceLimitExitCount > 0 { // ͲΕ͘Β͍ͷϝϞϦΛ࢖༻͍͔ͯͨ͠΋ՄೳͰ͋Ε͹ه࿥ errors.append(.background(.memoryLimit( backgroundExitData.cumulativeMemoryResourceLimitExitCount, averageSuspendedMemory, peakMemoryUsage ))) }

Slide 76

Slide 76 text

&SSPSΛ$SBTIMZUJDTʹૹ৴ … errors.append(.background(.memoryLimit( backgroundExitData.cumulativeMemoryResourceLimitExitCount, averageSuspendedMemory, peakMemoryUsage ))) } // ه࿥͕͋Ε͹Crashlyticsʹૹ৴͢Δ errors.forEach { logger.crashlyticsError(.performance($0)) }

Slide 77

Slide 77 text

$SBTIMZUJDTͰ௥੻Ͱ͖ΔΑ͏ʹͳͬͨ🙌

Slide 78

Slide 78 text

$SBTIMZUJDTͰ௥੻Ͱ͖ΔΑ͏ʹͳͬͨ🙌

Slide 79

Slide 79 text

$SBTIMZUJDTͰ௥੻Ͱ͖ΔΑ͏ʹͳͬͨ🙌

Slide 80

Slide 80 text

·ͱΊ w ΞϓϦͷύϑΥʔϚϯε৘ใͷऩूʹ͸͞·͟·ͳํ๏͕͋Δ͕ɺ.FUSJD,JU ͸ऩूͨ͠σʔλͷѻ͍ํΛࣗ༝ʹܾΊΒΕΔ w .FUSJD,JUΛ࢖͏ͱΞϓϦͷϦιʔεফඅ΍ىಈ࣌ؒɺϋϯά͕ൃੜͨ͠ස౓ ͱ͍ͬͨ໨ʹݟ͑ʹ͍͘ύϑΥʔϚϯε্ͷ਺஋Λड͚औΕΔ w ΞϓϦͷऴྃཧ༝ͱճ਺Λ௥͏͜ͱͰɺଞπʔϧͰϋϯυϦϯά͕೉͍͠Α ͏ͳΫϥογϡͷ೺Ѳʹ໾ཱͭ

Slide 81

Slide 81 text

No content