@mmerterden/multi-agent-pipeline 20.7.0 → 20.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/LICENSE +0 -10
- package/docs/facts.json +1 -1
- package/manifest.json +266 -267
- package/package.json +2 -2
- package/pipeline/scripts/_notices.mjs +1 -1
- package/pipeline/skills/.skill-manifest.json +68 -68
- package/pipeline/skills/shared/README.md +70 -70
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +373 -381
- package/pipeline/skills/shared/external/alarmkit/evals/evals.json +23 -18
- package/pipeline/skills/shared/external/alarmkit/references/alarmkit-patterns.md +328 -378
- package/pipeline/skills/shared/external/app-clips/SKILL.md +260 -160
- package/pipeline/skills/shared/external/app-clips/evals/evals.json +27 -27
- package/pipeline/skills/shared/external/app-clips/references/data-handoff-notifications-location.md +150 -83
- package/pipeline/skills/shared/external/app-clips/references/routing-and-experiences.md +135 -83
- package/pipeline/skills/shared/external/app-clips/references/size-capabilities-and-promotion.md +143 -85
- package/pipeline/skills/shared/external/app-intents/SKILL.md +302 -304
- package/pipeline/skills/shared/external/app-intents/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-intents/references/appintents-advanced.md +594 -894
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +339 -277
- package/pipeline/skills/shared/external/app-store-optimization/evals/evals.json +27 -23
- package/pipeline/skills/shared/external/app-store-optimization/references/keyword-research-methodology.md +105 -122
- package/pipeline/skills/shared/external/app-store-optimization/references/product-page-variants.md +143 -166
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +307 -326
- package/pipeline/skills/shared/external/app-store-review/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/app-store-review/references/privacy-manifest.md +105 -67
- package/pipeline/skills/shared/external/app-store-review/references/review-checklists.md +114 -101
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +333 -360
- package/pipeline/skills/shared/external/apple-on-device-ai/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-conversion.md +215 -322
- package/pipeline/skills/shared/external/apple-on-device-ai/references/coreml-optimization.md +161 -256
- package/pipeline/skills/shared/external/apple-on-device-ai/references/foundation-models.md +277 -387
- package/pipeline/skills/shared/external/apple-on-device-ai/references/mlx-swift.md +196 -210
- package/pipeline/skills/shared/external/authentication/SKILL.md +265 -381
- package/pipeline/skills/shared/external/authentication/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/authentication/references/keychain-biometric.md +133 -178
- package/pipeline/skills/shared/external/authentication/references/passkeys.md +111 -147
- package/pipeline/skills/shared/external/avkit/SKILL.md +267 -364
- package/pipeline/skills/shared/external/avkit/evals/evals.json +26 -26
- package/pipeline/skills/shared/external/avkit/references/avkit-patterns.md +375 -493
- package/pipeline/skills/shared/external/background-processing/SKILL.md +270 -382
- package/pipeline/skills/shared/external/background-processing/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/background-processing/references/background-task-patterns.md +169 -317
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +290 -371
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/callkit-voip/references/callkit-patterns.md +175 -343
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +292 -381
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +33 -30
- package/pipeline/skills/shared/external/cloudkit-sync/references/cloudkit-patterns.md +227 -355
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +197 -346
- package/pipeline/skills/shared/external/contacts-framework/evals/evals.json +19 -21
- package/pipeline/skills/shared/external/contacts-framework/references/contacts-patterns.md +169 -308
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +226 -376
- package/pipeline/skills/shared/external/core-bluetooth/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/core-bluetooth/references/ble-patterns.md +257 -337
- package/pipeline/skills/shared/external/core-data/SKILL.md +292 -368
- package/pipeline/skills/shared/external/core-data/evals/evals.json +30 -27
- package/pipeline/skills/shared/external/core-motion/SKILL.md +235 -324
- package/pipeline/skills/shared/external/core-motion/evals/evals.json +31 -27
- package/pipeline/skills/shared/external/core-motion/references/motion-patterns.md +210 -310
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +292 -366
- package/pipeline/skills/shared/external/core-nfc/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/core-nfc/references/nfc-patterns.md +233 -329
- package/pipeline/skills/shared/external/coreml/SKILL.md +323 -367
- package/pipeline/skills/shared/external/coreml/evals/evals.json +24 -21
- package/pipeline/skills/shared/external/coreml/references/coreml-swift-integration.md +562 -565
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +253 -394
- package/pipeline/skills/shared/external/cryptokit/evals/evals.json +20 -18
- package/pipeline/skills/shared/external/cryptokit/references/cryptokit-patterns.md +299 -488
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +270 -323
- package/pipeline/skills/shared/external/debugging-instruments/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md +167 -315
- package/pipeline/skills/shared/external/debugging-instruments/references/lldb-patterns.md +140 -193
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +230 -353
- package/pipeline/skills/shared/external/device-integrity/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/device-integrity/references/device-integrity-patterns.md +159 -197
- package/pipeline/skills/shared/external/energykit/SKILL.md +225 -392
- package/pipeline/skills/shared/external/energykit/evals/evals.json +29 -28
- package/pipeline/skills/shared/external/energykit/references/energykit-patterns.md +174 -470
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +261 -383
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +25 -22
- package/pipeline/skills/shared/external/eventkit-calendar/references/eventkit-patterns.md +165 -268
- package/pipeline/skills/shared/external/healthkit/SKILL.md +252 -303
- package/pipeline/skills/shared/external/healthkit/evals/evals.json +24 -23
- package/pipeline/skills/shared/external/healthkit/references/healthkit-patterns.md +369 -523
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +233 -348
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +27 -22
- package/pipeline/skills/shared/external/homekit-matter/references/matter-commissioning.md +199 -305
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +368 -340
- package/pipeline/skills/shared/external/ios-accessibility/evals/evals.json +28 -27
- package/pipeline/skills/shared/external/ios-accessibility/references/a11y-patterns.md +314 -260
- package/pipeline/skills/shared/external/ios-accessibility/references/media-accessibility.md +97 -67
- package/pipeline/skills/shared/external/ios-accessibility/references/nutrition-labels.md +165 -101
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +258 -371
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +23 -23
- package/pipeline/skills/shared/external/ios-localization/references/formatstyle-locale.md +283 -491
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +313 -440
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +265 -341
- package/pipeline/skills/shared/external/ios-networking/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/ios-networking/references/background-websocket.md +425 -652
- package/pipeline/skills/shared/external/ios-networking/references/file-storage-patterns.md +143 -285
- package/pipeline/skills/shared/external/ios-networking/references/lightweight-clients.md +93 -53
- package/pipeline/skills/shared/external/ios-networking/references/network-framework.md +231 -456
- package/pipeline/skills/shared/external/ios-networking/references/urlsession-patterns.md +517 -784
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +265 -393
- package/pipeline/skills/shared/external/ios-simulator/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/ios-simulator/references/simctl-commands.md +177 -270
- package/pipeline/skills/shared/external/live-activities/SKILL.md +318 -360
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/live-activities/references/activitykit-patterns.md +478 -710
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +295 -267
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +28 -24
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-corelocation-patterns.md +378 -532
- package/pipeline/skills/shared/external/mapkit-location/references/mapkit-patterns.md +397 -499
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +165 -348
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +26 -23
- package/pipeline/skills/shared/external/metrickit-diagnostics/references/metrickit-patterns.md +123 -130
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +189 -315
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +22 -21
- package/pipeline/skills/shared/external/musickit-audio/references/musickit-patterns.md +181 -270
- package/pipeline/skills/shared/external/natural-language/SKILL.md +188 -340
- package/pipeline/skills/shared/external/natural-language/evals/evals.json +21 -21
- package/pipeline/skills/shared/external/natural-language/references/translation-patterns.md +171 -225
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +258 -392
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +30 -29
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +164 -231
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +312 -344
- package/pipeline/skills/shared/external/pdfkit/evals/evals.json +19 -19
- package/pipeline/skills/shared/external/pdfkit/references/pdfkit-patterns.md +413 -624
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +242 -358
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +25 -21
- package/pipeline/skills/shared/external/pencilkit-drawing/references/pencilkit-patterns.md +161 -226
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +282 -400
- package/pipeline/skills/shared/external/permissionkit/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/permissionkit/references/permissionkit-patterns.md +237 -350
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +276 -325
- package/pipeline/skills/shared/external/photos-camera-media/references/av-playback.md +299 -545
- package/pipeline/skills/shared/external/photos-camera-media/references/camera-capture.md +344 -588
- package/pipeline/skills/shared/external/photos-camera-media/references/image-loading-caching.md +316 -660
- package/pipeline/skills/shared/external/photos-camera-media/references/photokit-patterns.md +270 -416
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +312 -340
- package/pipeline/skills/shared/external/push-notifications/evals/evals.json +27 -26
- package/pipeline/skills/shared/external/push-notifications/references/notification-patterns.md +328 -485
- package/pipeline/skills/shared/external/push-notifications/references/rich-notifications.md +327 -560
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +218 -410
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/realitykit-ar/references/realitykit-patterns.md +221 -348
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +222 -393
- package/pipeline/skills/shared/external/shareplay-activities/evals/evals.json +23 -24
- package/pipeline/skills/shared/external/shareplay-activities/references/shareplay-patterns.md +280 -420
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +217 -421
- package/pipeline/skills/shared/external/speech-recognition/evals/evals.json +23 -26
- package/pipeline/skills/shared/external/speech-recognition/references/speechanalyzer-patterns.md +133 -125
- package/pipeline/skills/shared/external/storekit/SKILL.md +228 -204
- package/pipeline/skills/shared/external/storekit/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/storekit/references/app-review-guidelines.md +98 -109
- package/pipeline/skills/shared/external/storekit/references/core-patterns.md +298 -242
- package/pipeline/skills/shared/external/storekit/references/storekit-advanced.md +356 -649
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +274 -399
- package/pipeline/skills/shared/external/swift-api-design-guidelines/evals/evals.json +22 -24
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/argument-labels-and-parameters.md +107 -108
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/conventions-and-special-rules.md +93 -165
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/naming-and-clarity.md +99 -137
- package/pipeline/skills/shared/external/swift-api-design-guidelines/references/side-effects-and-mutating-pairs.md +77 -120
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +334 -350
- package/pipeline/skills/shared/external/swift-architecture/evals/evals.json +22 -22
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +208 -394
- package/pipeline/skills/shared/external/swift-charts/evals/evals.json +27 -30
- package/pipeline/skills/shared/external/swift-charts/references/charts-patterns.md +351 -762
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +339 -343
- package/pipeline/skills/shared/external/swift-codable/evals/evals.json +20 -20
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +303 -351
- package/pipeline/skills/shared/external/swift-concurrency/evals/evals.json +27 -24
- package/pipeline/skills/shared/external/swift-concurrency/references/approachable-concurrency.md +65 -80
- package/pipeline/skills/shared/external/swift-concurrency/references/async-algorithms.md +48 -84
- package/pipeline/skills/shared/external/swift-concurrency/references/bridging-interop.md +134 -79
- package/pipeline/skills/shared/external/swift-concurrency/references/concurrency-patterns.md +145 -167
- package/pipeline/skills/shared/external/swift-concurrency/references/diagnostics.md +62 -50
- package/pipeline/skills/shared/external/swift-concurrency/references/swiftui-concurrency.md +92 -121
- package/pipeline/skills/shared/external/swift-concurrency/references/synchronization-primitives.md +177 -241
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +258 -234
- package/pipeline/skills/shared/external/swift-language/SKILL.md +342 -382
- package/pipeline/skills/shared/external/swift-language/evals/evals.json +24 -27
- package/pipeline/skills/shared/external/swift-language/references/swift-attributes-interop.md +79 -56
- package/pipeline/skills/shared/external/swift-language/references/swift-patterns-extended.md +297 -340
- package/pipeline/skills/shared/external/swift-security/SKILL.md +180 -161
- package/pipeline/skills/shared/external/swift-security/evals/evals.json +25 -25
- package/pipeline/skills/shared/external/swift-security/references/biometric-authentication.md +314 -469
- package/pipeline/skills/shared/external/swift-security/references/certificate-trust.md +408 -476
- package/pipeline/skills/shared/external/swift-security/references/common-anti-patterns.md +260 -530
- package/pipeline/skills/shared/external/swift-security/references/compliance-owasp-mapping.md +270 -477
- package/pipeline/skills/shared/external/swift-security/references/credential-storage-patterns.md +573 -571
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-public-key.md +370 -441
- package/pipeline/skills/shared/external/swift-security/references/cryptokit-symmetric.md +332 -433
- package/pipeline/skills/shared/external/swift-security/references/keychain-access-control.md +346 -468
- package/pipeline/skills/shared/external/swift-security/references/keychain-fundamentals.md +352 -472
- package/pipeline/skills/shared/external/swift-security/references/keychain-item-classes.md +431 -432
- package/pipeline/skills/shared/external/swift-security/references/keychain-sharing.md +328 -425
- package/pipeline/skills/shared/external/swift-security/references/migration-legacy-stores.md +341 -579
- package/pipeline/skills/shared/external/swift-security/references/secure-enclave.md +396 -457
- package/pipeline/skills/shared/external/swift-security/references/testing-security-code.md +354 -614
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +188 -175
- package/pipeline/skills/shared/external/swift-testing/evals/evals.json +26 -24
- package/pipeline/skills/shared/external/swift-testing/references/testing-advanced.md +80 -84
- package/pipeline/skills/shared/external/swift-testing/references/testing-patterns.md +317 -433
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +392 -256
- package/pipeline/skills/shared/external/swiftdata/evals/evals.json +24 -24
- package/pipeline/skills/shared/external/swiftdata/references/core-data-coexistence.md +206 -402
- package/pipeline/skills/shared/external/swiftdata/references/indexing.md +59 -52
- package/pipeline/skills/shared/external/swiftdata/references/predicate-pitfalls.md +57 -33
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-advanced.md +354 -747
- package/pipeline/skills/shared/external/swiftdata/references/swiftdata-queries.md +300 -508
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +175 -226
- package/pipeline/skills/shared/external/swiftlint/references/adoption-and-configuration.md +141 -208
- package/pipeline/skills/shared/external/swiftlint/references/custom-rules-and-analyze.md +100 -109
- package/pipeline/skills/shared/external/swiftlint/references/plugins-run-scripts-and-integrations.md +159 -179
- package/pipeline/skills/shared/external/swiftlint/references/rule-reference.md +383 -18
- package/pipeline/skills/shared/external/swiftlint/references/rules-suppressions-and-baselines.md +143 -229
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +283 -366
- package/pipeline/skills/shared/external/swiftui-animation/references/animation-advanced.md +396 -608
- package/pipeline/skills/shared/external/swiftui-animation/references/core-animation-bridge.md +336 -385
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +239 -349
- package/pipeline/skills/shared/external/swiftui-gestures/references/gesture-patterns.md +228 -310
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +260 -249
- package/pipeline/skills/shared/external/swiftui-layout-components/references/form.md +92 -74
- package/pipeline/skills/shared/external/swiftui-layout-components/references/grids.md +112 -177
- package/pipeline/skills/shared/external/swiftui-layout-components/references/list.md +61 -64
- package/pipeline/skills/shared/external/swiftui-layout-components/references/scrollview.md +94 -134
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +193 -225
- package/pipeline/skills/shared/external/swiftui-liquid-glass/references/liquid-glass.md +173 -327
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +193 -168
- package/pipeline/skills/shared/external/swiftui-navigation/references/deeplinks.md +127 -150
- package/pipeline/skills/shared/external/swiftui-navigation/references/navigationstack.md +132 -133
- package/pipeline/skills/shared/external/swiftui-navigation/references/sheets.md +152 -117
- package/pipeline/skills/shared/external/swiftui-navigation/references/tabview.md +106 -140
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +316 -252
- package/pipeline/skills/shared/external/swiftui-patterns/references/architecture-patterns.md +341 -332
- package/pipeline/skills/shared/external/swiftui-patterns/references/deprecated-migration.md +547 -854
- package/pipeline/skills/shared/external/swiftui-patterns/references/design-polish.md +485 -537
- package/pipeline/skills/shared/external/swiftui-patterns/references/platform-and-sharing.md +417 -499
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +213 -376
- package/pipeline/skills/shared/external/swiftui-performance/references/demystify-swiftui-performance-wwdc23.md +86 -175
- package/pipeline/skills/shared/external/swiftui-performance/references/optimizing-swiftui-performance-instruments.md +89 -195
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-hangs-in-your-app.md +95 -182
- package/pipeline/skills/shared/external/swiftui-performance/references/understanding-improving-swiftui-performance.md +71 -149
- package/pipeline/skills/shared/external/swiftui-performance/references/wwdc-session-sources.md +21 -27
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +303 -295
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/hosting-migration.md +204 -387
- package/pipeline/skills/shared/external/swiftui-uikit-interop/references/representable-recipes.md +469 -683
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +140 -186
- package/pipeline/skills/shared/external/swiftui-webkit/references/loading-and-observation.md +75 -86
- package/pipeline/skills/shared/external/swiftui-webkit/references/local-content-and-custom-schemes.md +63 -60
- package/pipeline/skills/shared/external/swiftui-webkit/references/migration-and-fallbacks.md +69 -137
- package/pipeline/skills/shared/external/swiftui-webkit/references/navigation-and-javascript.md +95 -67
- package/pipeline/skills/shared/external/tipkit/SKILL.md +220 -335
- package/pipeline/skills/shared/external/tipkit/references/tipkit-patterns.md +356 -494
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +260 -375
- package/pipeline/skills/shared/external/vision-framework/references/vision-requests.md +393 -515
- package/pipeline/skills/shared/external/vision-framework/references/visionkit-scanner.md +363 -539
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +152 -310
- package/pipeline/skills/shared/external/weatherkit/references/weatherkit-patterns.md +288 -407
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +216 -288
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +414 -719
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +0 -39
package/pipeline/skills/shared/external/debugging-instruments/references/instruments-guide.md
CHANGED
|
@@ -1,395 +1,247 @@
|
|
|
1
|
-
# Instruments Guide
|
|
2
|
-
|
|
3
|
-
Detailed template-by-template guide for profiling iOS apps with Instruments. Companion to the main `debugging-instruments` skill.
|
|
4
|
-
|
|
5
|
-
## Contents
|
|
6
|
-
|
|
7
|
-
- [General Workflow](#general-workflow)
|
|
8
|
-
- [Time Profiler](#time-profiler)
|
|
9
|
-
- [Allocations](#allocations)
|
|
10
|
-
- [Leaks](#leaks)
|
|
11
|
-
- [Network](#network)
|
|
12
|
-
- [SwiftUI Instruments](#swiftui-instruments)
|
|
13
|
-
- [Animation Hitches and Core Animation](#animation-hitches-and-core-animation)
|
|
14
|
-
- [Power Profiler](#power-profiler)
|
|
15
|
-
- [File Activity](#file-activity)
|
|
16
|
-
- [System Trace](#system-trace)
|
|
17
|
-
- [xctrace CLI](#xctrace-cli)
|
|
18
|
-
- [Custom Instruments with os_signpost](#custom-instruments-with-os_signpost)
|
|
19
|
-
- [Automation and CI Integration](#automation-and-ci-integration)
|
|
20
|
-
|
|
21
|
-
## General Workflow
|
|
22
|
-
|
|
23
|
-
1. **Build for profiling**: Product > Profile (Cmd+I). This builds with Release optimization by default.
|
|
24
|
-
2. **Select a template** from the Instruments chooser.
|
|
25
|
-
3. **Configure recording**: Set the target device and process.
|
|
26
|
-
4. **Record**: Press the red record button and reproduce the scenario.
|
|
27
|
-
5. **Analyze**: Use the timeline, detail views, and call tree to find issues.
|
|
28
|
-
6. **Filter**: Check "Hide System Libraries" and use the search bar to focus on your code.
|
|
29
|
-
|
|
30
|
-
Always profile on a **physical device** for accurate measurements. Simulator
|
|
31
|
-
performance does not reflect real-world behavior.
|
|
1
|
+
# Instruments Guide
|
|
32
2
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
**When to use**: CPU is high, UI is slow, animations stutter, or you need to
|
|
36
|
-
find which functions consume the most time.
|
|
37
|
-
|
|
38
|
-
### Key Workflow
|
|
3
|
+
Companion to the `debugging-instruments` skill: what each template is for, how
|
|
4
|
+
to read it, and how to drive recordings from scripts.
|
|
39
5
|
|
|
40
|
-
|
|
41
|
-
2. Select the time range of interest in the timeline.
|
|
42
|
-
3. Switch to the **Call Tree** view in the detail pane.
|
|
43
|
-
4. Enable these checkboxes:
|
|
44
|
-
- **Separate by Thread** - isolate main thread vs background
|
|
45
|
-
- **Invert Call Tree** - show leaf functions (actual work) first
|
|
46
|
-
- **Hide System Libraries** - focus on your code
|
|
47
|
-
5. Sort by **Weight** (self time) to find the hottest functions.
|
|
48
|
-
6. Double-click a function to view source with per-line timing.
|
|
6
|
+
## Workflow That Fits Every Template
|
|
49
7
|
|
|
50
|
-
|
|
8
|
+
Product > Profile (Cmd+I) builds the app for profiling, which uses the Release
|
|
9
|
+
configuration unless the scheme says otherwise. Then:
|
|
51
10
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
11
|
+
1. Choose a template.
|
|
12
|
+
2. Pick the device and the process to launch or attach to.
|
|
13
|
+
3. Record while you reproduce the problem.
|
|
14
|
+
4. Read the timeline, the detail pane and the call tree.
|
|
15
|
+
5. Narrow the data with Hide System Libraries and the search field.
|
|
55
16
|
|
|
56
|
-
|
|
17
|
+
Profile on a physical device. Simulator runs on the Mac's CPU and memory and
|
|
18
|
+
does not tell you how the app performs on a phone.
|
|
57
19
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
- Profile the same user interaction 3 times to get stable measurements.
|
|
61
|
-
- Use the **Comparison** view to diff traces before/after a fix.
|
|
62
|
-
- Check "Flatten Recursion" if recursive calls make the tree hard to read.
|
|
63
|
-
|
|
64
|
-
## Allocations
|
|
20
|
+
## Time Profiler
|
|
65
21
|
|
|
66
|
-
|
|
67
|
-
|
|
22
|
+
Use it for high CPU, slow screens, stuttering animations and for finding the
|
|
23
|
+
most expensive functions.
|
|
68
24
|
|
|
69
|
-
|
|
25
|
+
Reading the call tree:
|
|
70
26
|
|
|
71
|
-
1.
|
|
72
|
-
2.
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
- Navigate back
|
|
77
|
-
- Mark again
|
|
78
|
-
- The difference shows objects that were not freed
|
|
79
|
-
3. Expand a generation to see allocations grouped by category.
|
|
80
|
-
4. Filter by your module name to exclude system allocations.
|
|
27
|
+
1. Drag across the timeline to select the slow period.
|
|
28
|
+
2. Open the Call Tree and turn on Separate by Thread, Invert Call Tree (leaf
|
|
29
|
+
functions first) and Hide System Libraries.
|
|
30
|
+
3. Sort by Weight and double-click a function to see its source with per-line
|
|
31
|
+
cost.
|
|
81
32
|
|
|
82
|
-
|
|
33
|
+
Weight is time spent in the function including its callees; Self Weight counts
|
|
34
|
+
only the function's own code. Functions with a high Self Weight are the ones
|
|
35
|
+
doing the work.
|
|
83
36
|
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
-
|
|
37
|
+
Tips:
|
|
38
|
+
- Perform the interaction three times so the numbers settle.
|
|
39
|
+
- Record before and after a change and diff them in the comparison view.
|
|
40
|
+
- Flatten Recursion collapses deep recursive trees into one entry.
|
|
88
41
|
|
|
89
|
-
|
|
90
|
-
are your potential leaks.
|
|
42
|
+
## Allocations
|
|
91
43
|
|
|
92
|
-
|
|
44
|
+
Generation analysis:
|
|
93
45
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
46
|
+
1. Click Mark Generation.
|
|
47
|
+
2. Open the screen under suspicion.
|
|
48
|
+
3. Leave it again.
|
|
49
|
+
4. Click Mark Generation once more.
|
|
98
50
|
|
|
99
|
-
|
|
51
|
+
The second generation holds what the round trip left behind. Expand it to see
|
|
52
|
+
allocations grouped by category and filter by your module name.
|
|
100
53
|
|
|
101
|
-
|
|
54
|
+
Lifespan filters:
|
|
102
55
|
|
|
103
|
-
|
|
56
|
+
| Category | Meaning |
|
|
57
|
+
|----------|---------|
|
|
58
|
+
| Created & Still Living | Allocated in the range and still alive |
|
|
59
|
+
| Created & Destroyed | Allocated and freed in the range |
|
|
60
|
+
| Persistent | Long-lived by design: singletons, caches |
|
|
61
|
+
| Transient | Short-lived temporaries and autoreleased objects |
|
|
104
62
|
|
|
105
|
-
|
|
106
|
-
2. The tool automatically checks for leaks every 10 seconds.
|
|
107
|
-
3. Red "Leak" markers appear in the timeline when leaks are detected.
|
|
108
|
-
4. Click a leak marker to see the leaked object and its retain/release history.
|
|
109
|
-
5. The **Cycles & Roots** view shows the reference graph - follow the arrows
|
|
110
|
-
to find the cycle.
|
|
63
|
+
In a generation diff, "Created & Still Living" is where leaks hide.
|
|
111
64
|
|
|
112
|
-
|
|
65
|
+
For overall heap growth, sort the Allocations List by Persistent Bytes. Watch
|
|
66
|
+
for types with surprisingly high counts, images or `Data` buffers that are
|
|
67
|
+
never released, and view controllers that outlive their dismissal.
|
|
113
68
|
|
|
114
|
-
|
|
115
|
-
- **Root Leak**: the object at the head of a leaked object graph
|
|
116
|
-
- **Cycles & Roots graph**: arrows show retain relationships - look for
|
|
117
|
-
bidirectional arrows indicating a cycle
|
|
69
|
+
## Leaks
|
|
118
70
|
|
|
119
|
-
|
|
71
|
+
- A leak check runs automatically every 10 seconds.
|
|
72
|
+
- Red markers on the timeline show where leaks were found; click one to see the
|
|
73
|
+
object and its retain and release history.
|
|
74
|
+
- Cycles & Roots draws the reference graph; arrows in both directions mean a
|
|
75
|
+
cycle.
|
|
76
|
+
- A *leak* is an object nothing refers to any more; a *root leak* is the top of
|
|
77
|
+
a leaked object graph.
|
|
120
78
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
- NotificationCenter observer blocks retaining self
|
|
125
|
-
- CADisplayLink/Timer retaining target
|
|
79
|
+
Cycles this usually finds: a closure stored on an object that captures that
|
|
80
|
+
object, strong delegate references, block-based `NotificationCenter` observers
|
|
81
|
+
that capture `self`, and `CADisplayLink` or `Timer` retaining its target.
|
|
126
82
|
|
|
127
83
|
## Network
|
|
128
84
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
### Key Workflow
|
|
85
|
+
Each HTTP request appears as a bar on the timeline. Selecting one shows the
|
|
86
|
+
URL, method, status code, headers, a timing split (DNS, connect, TLS, request,
|
|
87
|
+
response) and the payload size.
|
|
133
88
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
- Payload size
|
|
89
|
+
What to look for:
|
|
90
|
+
- Gaps in a waterfall where requests run one after another but could run in
|
|
91
|
+
parallel.
|
|
92
|
+
- Large responses that need pagination or compression.
|
|
93
|
+
- The same request sent more than once.
|
|
94
|
+
- Slow DNS or TLS setup that connection prewarming could hide.
|
|
141
95
|
|
|
142
|
-
|
|
96
|
+
## SwiftUI
|
|
143
97
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
- **Redundant requests**: duplicate calls to the same endpoint
|
|
147
|
-
- **DNS/TLS latency**: consider connection prewarming
|
|
98
|
+
Use it for bodies that run too often, redraws with no visible change, and list
|
|
99
|
+
rows whose identity keeps changing.
|
|
148
100
|
|
|
149
|
-
|
|
101
|
+
Lanes to read:
|
|
102
|
+
- **Update Groups**: batches of work SwiftUI performed together.
|
|
103
|
+
- **Long View Body Updates**: bodies that took longer than the threshold.
|
|
104
|
+
- **Cause and Effect Graph**: the chain of changes that made a view update.
|
|
150
105
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
### Key Workflow
|
|
155
|
-
|
|
156
|
-
1. Select the **SwiftUI** template in Instruments.
|
|
157
|
-
2. Record while interacting with the UI.
|
|
158
|
-
3. Check these lanes:
|
|
159
|
-
- **Update Groups**: shows batches of view updates triggered together
|
|
160
|
-
- **Long View Body Updates**: highlights body evaluations exceeding a time threshold
|
|
161
|
-
- **Cause and Effect Graph**: traces why a view was re-evaluated
|
|
162
|
-
4. Look for views with excessive body evaluations during a single interaction.
|
|
163
|
-
|
|
164
|
-
### Tips
|
|
165
|
-
|
|
166
|
-
- Filter by view name to focus on a specific component.
|
|
167
|
-
- Cross-reference with Time Profiler to see if body evaluations are expensive.
|
|
168
|
-
- See the `swiftui-performance` skill for remediation patterns.
|
|
106
|
+
Filter by view name and cross-check hot spots against Time Profiler. How to fix
|
|
107
|
+
what you find belongs to the `swiftui-performance` skill.
|
|
169
108
|
|
|
170
109
|
## Animation Hitches and Core Animation
|
|
171
110
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
1. Record with the **Animation Hitches** template on a real device when the
|
|
177
|
-
symptom is stutter or missed frames.
|
|
178
|
-
2. Add Core Animation instruments such as **Core Animation FPS**,
|
|
179
|
-
**Core Animation Commits**, or **Core Animation Activity** when you need
|
|
180
|
-
lower-level render pipeline detail.
|
|
181
|
-
3. Check FPS, hitches, commits, and frame lifetime lanes for drops or long
|
|
182
|
-
commit/render work.
|
|
183
|
-
4. Enable these debug options in Recording Options or Xcode view debugging:
|
|
184
|
-
- **Color Blended Layers** - red areas have multiple overlapping layers
|
|
185
|
-
- **Color Off-screen Rendered** - yellow areas use off-screen passes
|
|
186
|
-
- **Color Hits Green and Misses Red** - rasterization cache hits/misses
|
|
111
|
+
Record Animation Hitches on a real device when scrolling or animations stutter
|
|
112
|
+
or frames are missed. For lower-level rendering detail add Core Animation FPS,
|
|
113
|
+
Core Animation Commits or Core Animation Activity, and read the FPS, hitch,
|
|
114
|
+
commit and frame-lifetime lanes.
|
|
187
115
|
|
|
188
|
-
|
|
116
|
+
Rendering diagnostics live in Xcode (Debug > View Debugging > Rendering) and
|
|
117
|
+
in Simulator's Debug menu rather than in current Instruments:
|
|
118
|
+
- **Color Blended Layers**: overlapping translucent layers show in red.
|
|
119
|
+
- **Color Off-screen Rendered**: layers rendered off screen show in yellow.
|
|
120
|
+
- **Color Hits Green and Misses Red**: rasterization cache hits and misses.
|
|
189
121
|
|
|
190
|
-
|
|
|
191
|
-
|
|
192
|
-
|
|
|
193
|
-
|
|
|
194
|
-
|
|
|
195
|
-
|
|
|
122
|
+
| Problem | Why it costs | Fix |
|
|
123
|
+
|---------|--------------|-----|
|
|
124
|
+
| Stacked transparent views | Blending, red in Color Blended Layers | Give views opaque backgrounds |
|
|
125
|
+
| Rounded corners with `masksToBounds` over image content | Off-screen pass | Round the image once before display, or avoid masking |
|
|
126
|
+
| Shadows without a path | Off-screen pass to find the shape | Set `shadowPath` |
|
|
127
|
+
| Full-size images in small views | Memory and decode cost | Downsample to display size first |
|
|
196
128
|
|
|
197
129
|
## Power Profiler
|
|
198
130
|
|
|
199
|
-
|
|
200
|
-
|
|
131
|
+
Use it for battery complaints, energy spent in the background, or an App Store
|
|
132
|
+
rejection that cites energy use. Record on a physical device.
|
|
201
133
|
|
|
202
|
-
|
|
134
|
+
Read the power, thermal state and energy impact lanes, and the per-component
|
|
135
|
+
split: CPU, network, location, GPU and background tasks.
|
|
203
136
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
- Location
|
|
210
|
-
- GPU
|
|
211
|
-
- Background tasks
|
|
212
|
-
|
|
213
|
-
### Tips
|
|
214
|
-
|
|
215
|
-
- Profile typical user sessions (5-10 minutes of real usage).
|
|
216
|
-
- Compare foreground vs background energy impact.
|
|
217
|
-
- Check that background tasks complete and do not run indefinitely.
|
|
218
|
-
- Cross-reference with MetricKit energy metrics from production.
|
|
137
|
+
Tips:
|
|
138
|
+
- Record a realistic session of 5 to 10 minutes.
|
|
139
|
+
- Compare the app in the foreground with the app in the background.
|
|
140
|
+
- Make sure background tasks finish and stop.
|
|
141
|
+
- Cross-check against MetricKit energy metrics from the field.
|
|
219
142
|
|
|
220
143
|
## File Activity
|
|
221
144
|
|
|
222
|
-
|
|
223
|
-
exceptions
|
|
224
|
-
|
|
225
|
-
### Key Workflow
|
|
226
|
-
|
|
227
|
-
1. Record with the File Activity template.
|
|
228
|
-
2. Look for:
|
|
229
|
-
- Frequent writes to the same file (journaling, logging)
|
|
230
|
-
- Large reads on the main thread
|
|
231
|
-
- Unintended file access patterns
|
|
145
|
+
Use it for slow file operations, heavy disk I/O and MetricKit disk-write
|
|
146
|
+
exceptions. Look for the same file written again and again, large reads on the
|
|
147
|
+
main thread and access patterns you did not expect.
|
|
232
148
|
|
|
233
149
|
## System Trace
|
|
234
150
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
151
|
+
Use it when you need to see thread scheduling, virtual memory faults, system
|
|
152
|
+
calls or IPC. Start from the main thread's lane and look for:
|
|
153
|
+
- threads blocked on locks, semaphores or dispatch queues,
|
|
154
|
+
- VM page faults,
|
|
155
|
+
- a high number of context switches.
|
|
239
156
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
3. Look for:
|
|
243
|
-
- **Thread blocks**: main thread waiting on locks, semaphores, or dispatch queues
|
|
244
|
-
- **VM faults**: page faults from memory-mapped files or large allocations
|
|
245
|
-
- **Context switches**: excessive switching between threads
|
|
157
|
+
It is the most detailed template. Reach for it after Time Profiler, when you
|
|
158
|
+
need to know what the operating system was doing.
|
|
246
159
|
|
|
247
|
-
|
|
248
|
-
need OS-level detail.
|
|
249
|
-
|
|
250
|
-
## xctrace CLI
|
|
251
|
-
|
|
252
|
-
### Recording
|
|
253
|
-
|
|
254
|
-
```bash
|
|
255
|
-
# Record Time Profiler trace
|
|
256
|
-
xcrun xctrace record \
|
|
257
|
-
--template "Time Profiler" \
|
|
258
|
-
--device "iPhone" \
|
|
259
|
-
--output ~/traces/profile.trace \
|
|
260
|
-
--time-limit 30s \
|
|
261
|
-
--launch -- /path/to/MyApp.app
|
|
262
|
-
|
|
263
|
-
# Record Allocations trace for a running app
|
|
264
|
-
xcrun xctrace record \
|
|
265
|
-
--template "Allocations" \
|
|
266
|
-
--device "iPhone" \
|
|
267
|
-
--output ~/traces/alloc.trace \
|
|
268
|
-
--attach MyApp
|
|
269
|
-
|
|
270
|
-
# Record with multiple instruments
|
|
271
|
-
xcrun xctrace record \
|
|
272
|
-
--template "Time Profiler" \
|
|
273
|
-
--instrument "Allocations" \
|
|
274
|
-
--output ~/traces/combined.trace \
|
|
275
|
-
--launch -- /path/to/MyApp.app
|
|
276
|
-
```
|
|
277
|
-
|
|
278
|
-
### Exporting Data
|
|
160
|
+
## xctrace
|
|
279
161
|
|
|
280
162
|
```bash
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
xcrun xctrace export --input
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
# Export to a file
|
|
289
|
-
xcrun xctrace export --input profile.trace \
|
|
290
|
-
--xpath '/trace-toc/run/data/table[@schema="time-profile"]' \
|
|
291
|
-
--output profile_data.xml
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### Listing Resources
|
|
295
|
-
|
|
296
|
-
```bash
|
|
297
|
-
# Available templates
|
|
298
|
-
xcrun xctrace list templates
|
|
299
|
-
|
|
300
|
-
# Connected devices
|
|
301
|
-
xcrun xctrace list devices
|
|
302
|
-
|
|
303
|
-
# Available instruments
|
|
163
|
+
xcrun xctrace record --template "Time Profiler" --time-limit 30s \
|
|
164
|
+
--output scroll.trace --launch -- /path/to/Atlas.app
|
|
165
|
+
xcrun xctrace record --template "Allocations" --attach Atlas --output memory.trace
|
|
166
|
+
xcrun xctrace export --input scroll.trace --toc
|
|
167
|
+
xcrun xctrace export --input scroll.trace \
|
|
168
|
+
--xpath '/trace-toc/run/data/table[@schema="time-profile"]' --output time-profile.xml
|
|
304
169
|
xcrun xctrace list instruments
|
|
305
170
|
```
|
|
306
171
|
|
|
307
|
-
|
|
172
|
+
- `--time-limit` stops the recording on its own.
|
|
173
|
+
- `--attach` records an app that is already running, instead of `--launch`.
|
|
174
|
+
- `--toc` lists the tables inside a trace; `--xpath` picks one to export.
|
|
308
175
|
|
|
309
|
-
|
|
176
|
+
## Custom Intervals with Signposts
|
|
310
177
|
|
|
311
178
|
```swift
|
|
312
179
|
import os
|
|
313
180
|
|
|
314
|
-
let signposter = OSSignposter(subsystem: "com.example.
|
|
181
|
+
let signposter = OSSignposter(subsystem: "com.example.atlas", category: "Catalog")
|
|
315
182
|
|
|
316
|
-
func
|
|
317
|
-
let
|
|
318
|
-
let state = signposter.beginInterval("
|
|
319
|
-
defer { signposter.endInterval("
|
|
183
|
+
func loadCatalog(from url: URL) async throws -> [Product] {
|
|
184
|
+
let id = signposter.makeSignpostID()
|
|
185
|
+
let state = signposter.beginInterval("loadCatalog", id: id)
|
|
186
|
+
defer { signposter.endInterval("loadCatalog", state) }
|
|
320
187
|
|
|
321
|
-
let (data, _) = try await URLSession.shared.data(from:
|
|
322
|
-
signposter.emitEvent("
|
|
323
|
-
|
|
324
|
-
return try JSONDecoder().decode(User.self, from: data)
|
|
188
|
+
let (data, _) = try await URLSession.shared.data(from: url)
|
|
189
|
+
signposter.emitEvent("downloaded", id: id, "\(data.count) bytes")
|
|
190
|
+
return try JSONDecoder().decode([Product].self, from: data)
|
|
325
191
|
}
|
|
326
192
|
```
|
|
327
193
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
instrument, or start from a template that includes **Points of Interest**.
|
|
332
|
-
2. Your custom intervals appear as labeled bars in the timeline.
|
|
333
|
-
3. Events appear as point markers.
|
|
334
|
-
4. Filter by subsystem or category to isolate your signposts.
|
|
194
|
+
To see them, start from a Blank document and add the os_signpost instrument,
|
|
195
|
+
or use any template that includes Points of Interest. Intervals appear as
|
|
196
|
+
labelled bars and events as single markers; filter by subsystem and category.
|
|
335
197
|
|
|
336
|
-
|
|
198
|
+
Signposts written to a log from `MXMetricManager.makeLogHandle(category:)` are
|
|
199
|
+
also counted in MetricKit payloads; the `metrickit-diagnostics` skill covers
|
|
200
|
+
that side.
|
|
337
201
|
|
|
338
|
-
|
|
339
|
-
also reported in MetricKit payloads. See the `metrickit` skill
|
|
340
|
-
for details on custom signpost metrics.
|
|
202
|
+
## Automation and CI
|
|
341
203
|
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
### Performance Baselines with xctrace
|
|
345
|
-
|
|
346
|
-
Create a shell script for CI:
|
|
204
|
+
A script a CI job can run:
|
|
347
205
|
|
|
348
206
|
```bash
|
|
349
207
|
#!/bin/bash
|
|
350
208
|
set -euo pipefail
|
|
351
209
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
# Record trace
|
|
357
|
-
xcrun xctrace record \
|
|
358
|
-
--template "$TEMPLATE" \
|
|
359
|
-
--output "$TRACE_OUTPUT" \
|
|
360
|
-
--time-limit 60s \
|
|
361
|
-
--launch -- "$APP_BUNDLE"
|
|
210
|
+
stamp=$(date +%Y%m%d-%H%M%S)
|
|
211
|
+
trace="traces/launch-$stamp.trace"
|
|
212
|
+
mkdir -p traces
|
|
362
213
|
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
--toc > "traces/toc.xml"
|
|
367
|
-
|
|
368
|
-
echo "Trace saved to $TRACE_OUTPUT"
|
|
214
|
+
xcrun xctrace record --template "Time Profiler" --time-limit 60s \
|
|
215
|
+
--output "$trace" --launch -- "$APP_PATH"
|
|
216
|
+
xcrun xctrace export --input "$trace" --toc > "traces/launch-$stamp-toc.xml"
|
|
369
217
|
```
|
|
370
218
|
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
Complement Instruments with in-test measurements:
|
|
219
|
+
XCTest can measure a flow and compare it with a stored baseline:
|
|
374
220
|
|
|
375
221
|
```swift
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
222
|
+
import XCTest
|
|
223
|
+
|
|
224
|
+
final class FeedScrollPerformanceTests: XCTestCase {
|
|
225
|
+
@MainActor
|
|
226
|
+
func testFeedScrolling() {
|
|
227
|
+
let app = XCUIApplication()
|
|
228
|
+
app.launch()
|
|
229
|
+
|
|
230
|
+
let options = XCTMeasureOptions()
|
|
231
|
+
options.iterationCount = 5
|
|
232
|
+
|
|
233
|
+
measure(metrics: [XCTClockMetric(),
|
|
234
|
+
XCTCPUMetric(application: app),
|
|
235
|
+
XCTMemoryMetric(application: app),
|
|
236
|
+
XCTStorageMetric(application: app)],
|
|
237
|
+
options: options) {
|
|
238
|
+
app.swipeUp()
|
|
239
|
+
app.swipeDown()
|
|
240
|
+
}
|
|
391
241
|
}
|
|
392
242
|
}
|
|
393
243
|
```
|
|
394
244
|
|
|
395
|
-
|
|
245
|
+
`XCUIApplication` and its gestures are main-actor isolated, hence `@MainActor`
|
|
246
|
+
on the test method. Set a baseline for each measurement in Xcode's test report; later runs that
|
|
247
|
+
exceed it fail, so CI flags the regression without anyone reading traces.
|