iOS Memgraph Analysis
dpearson2699/swift-ios-skills
A skill your agent uses when capturing or analyzing an iOS .memgraph, especially when the task mentions a memory leak, heap growth, persistent memory increase, ownership path, or matched-capture…
Instruments integration and performance analysis workflows for iOS apps.
$ npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install conorluddy/xclaude-plugin performance-profiling --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/performance-profiling .claude/skills/performance-profiling && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "performance-profiling" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profiling into .claude/skills/performance-profiling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-profiling", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profilingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install conorluddy/xclaude-plugin performance-profiling --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/performance-profiling .agents/skills/performance-profiling && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "performance-profiling" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profiling into .agents/skills/performance-profiling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-profiling", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install conorluddy/xclaude-plugin performance-profiling --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/performance-profiling .cursor/skills/performance-profiling && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "performance-profiling" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profiling into .cursor/skills/performance-profiling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-profiling", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/conorluddy/xclaude-plugin.git --path skills/performance-profiling--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install conorluddy/xclaude-plugin performance-profiling --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/performance-profiling .gemini/skills/performance-profiling && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "performance-profiling" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profiling into .gemini/skills/performance-profiling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-profiling", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install conorluddy/xclaude-plugin performance-profilingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/performance-profiling .github/skills/performance-profiling && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "performance-profiling" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profiling into .github/skills/performance-profiling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-profiling", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install conorluddy/xclaude-plugin performance-profiling --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/conorluddy/xclaude-plugin.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/performance-profiling .opencode/skills/performance-profiling && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "performance-profiling" agent skill from https://github.com/conorluddy/xclaude-plugin/tree/main/skills/performance-profiling into .opencode/skills/performance-profiling/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "performance-profiling", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
performance-profilingInstruments integration and performance analysis workflows for iOS apps.
Performance Profiling is an agent skill from conorluddy/xclaude-plugin. Instruments integration and performance analysis workflows for iOS apps. Use when profiling CPU usage, memory allocation, network activity, or energy consumption. Covers Time Profiler, Allocations, Leaks, Network instruments, and performance optimization strategies.
Its SKILL.md is about 7.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Performance optimization and iOS development. It works with Xcode, Model Context Protocol and iOS. The repository describes itself as: iOS development ClaudeCode plugin for mindful token and context usage. Contains modular MCPs that group various Xcode/IDB tools based on your current workflow. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 6de4b2c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
xcodebuildFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Performance Profiling loads about 7.3k tokens when it runs. Until then it costs about 72 tokens; SKILL.md has 1,955 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from conorluddy/xclaude-plugin at commit 6de4b2c, republished under its MIT licence (© conorluddy). 1,955 words, ~7,293 tokens.
.claude/skills/performance-profiling/SKILL.md (or your agent's skills folder).Comprehensive guide to iOS performance analysis and optimization
Performance profiling is the systematic analysis of an iOS app's runtime behavior to identify bottlenecks, memory issues, network inefficiencies, and energy consumption patterns. This Skill guides you through using Instruments templates, interpreting profiling data, and applying optimization strategies.
Key Tools:
Use performance profiling when:
App Performance Issues
Memory Problems
Network Inefficiencies
Energy Consumption
Pre-Release Optimization
Time Profiler
Allocations
Leaks
Network
Energy Log
Core Animation
Sampling vs Tracing
Sampling (Time Profiler):
Tracing (Most other instruments):
Launch Time
Scrolling Performance
Memory Footprint
Network Efficiency
Energy Impact
Goal: Identify CPU-intensive operations and optimize hot paths
Step 1: Build for Profiling
{
"operation": "build",
"scheme": "MyApp",
"configuration": "Release",
"destination": "platform=iOS,id=<device-udid>",
"options": {
"archive_for_profiling": true
}
}Why Release Configuration?
Device vs Simulator:
Step 2: Profile with Instruments
# Launch Instruments with Time Profiler template
instruments -t "Time Profiler" \
-D /path/to/trace.trace \
-w <device-udid> \
com.example.MyAppManual Approach:
Step 3: Analyze Call Tree
Call Tree Settings:
Interpret Results:
Red Flags:
Step 4: Optimize
Common Optimizations:
Verification:
Goal: Identify memory leaks and reduce memory footprint
Step 1: Build for Profiling
{
"operation": "build",
"scheme": "MyApp",
"configuration": "Debug",
"destination": "platform=iOS Simulator,name=iPhone 15",
"options": {
"enable_memory_debugging": true
}
}Note: Use Debug for better stack traces, Simulator acceptable for memory profiling
Step 2: Profile with Allocations
# Launch Instruments with Allocations template
instruments -t "Allocations" \
-D /path/to/allocations.trace \
-w <simulator-udid> \
com.example.MyAppStep 3: Identify Memory Growth
Heap Growth Analysis:
Expected: Minimal growth after repeated operations Red Flag: Continuous growth with each iteration
Step 4: Find Leaks
Switch to Leaks Instrument:
instruments -t "Leaks" \
-D /path/to/leaks.trace \
-w <simulator-udid> \
com.example.MyAppInterpret Results:
Step 5: Debug Retain Cycles
Memory Graph Debugger:
Common Patterns:
Solutions:
[weak self] in closuresweakGoal: Optimize network requests and reduce data usage
Step 1: Profile with Network Instrument
instruments -t "Network" \
-D /path/to/network.trace \
-w <device-udid> \
com.example.MyAppStep 2: Analyze Network Activity
Key Metrics:
Red Flags:
Step 3: Optimize Requests
Batching:
// Before: 10 separate requests
for item in items {
fetchDetails(for: item)
}
// After: 1 batched request
fetchDetails(for: items)Pagination:
// Fetch 20 items at a time
func fetchItems(page: Int, pageSize: Int = 20) {
let offset = page * pageSize
api.fetch(limit: pageSize, offset: offset)
}Caching:
// Use URLCache or custom cache
let cache = URLCache.shared
cache.diskCapacity = 50 * 1024 * 1024 // 50MBCompression:
// Enable gzip compression
request.setValue("gzip", forHTTPHeaderField: "Accept-Encoding")Goal: Reduce battery drain and thermal impact
Step 1: Profile with Energy Log
instruments -t "Energy Log" \
-D /path/to/energy.trace \
-w <device-udid> \
com.example.MyAppStep 2: Analyze Energy Impact
Energy Sources:
Energy Levels:
Target: Stay in "Low" or "Medium" most of the time
Step 3: Optimize Energy Usage
CPU Optimization:
Network Optimization:
Display Optimization:
Location Optimization:
Measurement Approach:
instruments -t "App Launch" \
-D /path/to/launch.trace \
-w <device-udid> \
com.example.MyAppOptimization Strategies:
Optimization Strategies:
Target: < 400ms total launch time on device
Measurement Approach:
instruments -t "Core Animation" \
-D /path/to/scroll.trace \
-w <device-udid> \
com.example.MyAppCheck Frame Rate
Identify Frame Drops
Optimization Strategies:
Cell Reuse:
// Proper cell reuse
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
configure(cell: cell, with: data[indexPath.row])
return cell
}Image Optimization:
// Downsize images to display size
let size = imageView.bounds.size
let downsizedImage = image.resized(to: size)
imageView.image = downsizedImageLayout Caching:
// Cache calculated heights
private var heightCache: [IndexPath: CGFloat] = [:]
func tableView(_ tableView: UITableView,
heightForRowAt indexPath: IndexPath) -> CGFloat {
if let height = heightCache[indexPath] {
return height
}
let height = calculateHeight(for: indexPath)
heightCache[indexPath] = height
return height
}Off-Main-Thread Work:
// Move image processing off main thread
DispatchQueue.global(qos: .userInitiated).async {
let processedImage = self.processImage(image)
DispatchQueue.main.async {
self.imageView.image = processedImage
}
}Systematic Approach:
Identify Suspect Feature
Create Reproduction Steps
1. Launch app
2. Open profile view
3. Close profile view
4. Repeat 10 timesProfile with Leaks
Analyze Leak Origin
Identify Leak Pattern
[weak self] missingweakFix and Verify
Analysis Workflow:
Baseline Measurement
Identify Inefficiencies
Optimization Strategies
Request Batching:
// Batch multiple IDs into single request
func fetchUsers(ids: [String]) {
let batchedIDs = ids.joined(separator: ",")
api.get("/users?ids=\(batchedIDs)")
}Response Pagination:
// Implement cursor-based pagination
func fetchFeed(cursor: String? = nil, limit: Int = 20) {
var params = ["limit": limit]
if let cursor = cursor {
params["cursor"] = cursor
}
api.get("/feed", parameters: params)
}Intelligent Caching:
// Cache with expiration
class APICache {
private var cache: [String: CachedResponse] = [:]
func get(url: String) -> Data? {
guard let cached = cache[url],
!cached.isExpired else { return nil }
return cached.data
}
func set(url: String, data: Data, ttl: TimeInterval = 300) {
cache[url] = CachedResponse(data: data, expiry: Date() + ttl)
}
}Request Coalescing:
// Prevent duplicate in-flight requests
class RequestCoalescer {
private var inFlightRequests: [String: Task<Data, Error>] = [:]
func request(url: String) async throws -> Data {
if let existing = inFlightRequests[url] {
return try await existing.value
}
let task = Task {
let data = try await performRequest(url)
inFlightRequests[url] = nil
return data
}
inFlightRequests[url] = task
return try await task.value
}
}Understanding Call Tree Structure:
Total Time | Self Time | Symbol
-----------|-----------|--------
1000ms | 10ms | -[UITableView reloadData]
800ms | 50ms | └─ -[MyCell configure]
700ms | 700ms | └─ -[ImageProcessor processImage]Reading:
reloadData took 1000ms totalreloadData itselfconfigure (called from reloadData)processImage (called from configure)Optimization Target: processImage (700ms self time)
Call Tree Filters:
Separate by Thread:
Hide System Libraries:
Flatten Recursion:
Show Obj-C Only / Swift Only:
Visual Representation:
Interpretation:
Example:
[ main ] ← 100% of time
[ viewDidLoad ][ updateUI ] ← 50% each
[loadData][parseJSON] [layout][render] ← BreakdownOptimization Strategy:
Workflow:
Capture Memory Graph
Filter View
Inspect Object
Trace Retain Cycle
weak should be usedExample Cycle:
ViewController → (strong) Closure → (strong) ViewControllerFix:
// Before (leak)
viewModel.onUpdate = {
self.updateUI()
}
// After (no leak)
viewModel.onUpdate = { [weak self] in
self?.updateUI()
}Continuous Performance Testing:
Establish Baseline
Automated Performance Tests
func testLaunchPerformance() throws {
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
func testScrollPerformance() throws {
let app = XCUIApplication()
app.launch()
measure(metrics: [XCTOSSignpostMetric.scrollDecelerationMetric]) {
app.tables.firstMatch.swipeUp()
}
}CI Integration
Regression Analysis
Baseline Format:
{
"launch_time_ms": 350,
"memory_mb": 120,
"scroll_fps": 59,
"thresholds": {
"launch_time_ms": 450,
"memory_mb": 150,
"scroll_fps": 55
}
}Symptoms:
Common Causes:
1. Main Thread Blocking
// Problem: Heavy work on main thread
DispatchQueue.main.async {
let result = expensiveCalculation() // Blocks UI
updateUI(with: result)
}
// Solution: Move work off main thread
DispatchQueue.global(qos: .userInitiated).async {
let result = expensiveCalculation()
DispatchQueue.main.async {
updateUI(with: result)
}
}2. Polling/Tight Loops
// Problem: Constant polling
Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { _ in
checkForUpdates() // Called 100 times per second!
}
// Solution: Reasonable interval or event-driven
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
checkForUpdates() // Called once per second
}3. Inefficient Algorithms
// Problem: O(n²) complexity
for item in items {
for other in items {
compare(item, other) // n² comparisons
}
}
// Solution: O(n log n) or O(n)
let sorted = items.sorted()
for (item, other) in zip(sorted, sorted.dropFirst()) {
compare(item, other) // n comparisons
}Symptoms:
Common Patterns:
1. Unbounded Cache Growth
// Problem: Cache grows indefinitely
class ImageCache {
private var cache: [URL: UIImage] = [:] // Never clears!
}
// Solution: Use NSCache (auto-eviction)
class ImageCache {
private let cache = NSCache<NSURL, UIImage>()
init() {
cache.countLimit = 100 // Max 100 images
}
}2. Event Listener Accumulation
// Problem: Listeners never removed
override func viewWillAppear(_ animated: Bool) {
NotificationCenter.default.addObserver(/* ... */) // Added every time!
}
// Solution: Remove in viewWillDisappear
override func viewWillDisappear(_ animated: Bool) {
NotificationCenter.default.removeObserver(self)
}3. Large Object Retention
// Problem: Keeping large objects in memory
class ViewController: UIViewController {
var cachedImage: UIImage? // Large image retained
}
// Solution: Cache only when needed, clear when done
class ViewController: UIViewController {
private var cachedImage: UIImage?
override func didReceiveMemoryWarning() {
cachedImage = nil // Release when memory pressure
}
}Symptoms:
Common Issues:
1. Waterfall Requests
// Problem: Sequential dependent requests
func loadProfile() async {
let user = await fetchUser() // Wait...
let posts = await fetchPosts(for: user) // Wait...
let comments = await fetchComments(for: posts) // Wait...
}
// Solution: Parallel independent requests
func loadProfile() async {
async let user = fetchUser()
async let followers = fetchFollowers()
async let settings = fetchSettings()
let (u, f, s) = await (user, followers, settings)
}2. No Request Deduplication
// Problem: Same request made multiple times
func loadData() {
fetchUsers() // Request 1
fetchUsers() // Request 2 (redundant!)
}
// Solution: Deduplicate requests
class APIClient {
private var pendingRequests: [String: Task<Data, Error>] = [:]
func fetch(url: String) async throws -> Data {
if let pending = pendingRequests[url] {
return try await pending.value // Reuse
}
let task = Task { try await URLSession.shared.data(from: URL(string: url)!) }
pendingRequests[url] = task
defer { pendingRequests[url] = nil }
return try await task.value
}
}3. Large Uncompressed Payloads
// Problem: Sending/receiving uncompressed data
URLSession.shared.dataTask(with: url) // Default: no compression
// Solution: Enable compression
var request = URLRequest(url: url)
request.setValue("gzip, deflate", forHTTPHeaderField: "Accept-Encoding")
URLSession.shared.dataTask(with: request)Symptoms:
Common Causes:
1. Excessive Background Activity
// Problem: Constant background work
func applicationDidEnterBackground(_ application: UIApplication) {
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { _ in
syncData() // Drains battery in background
}
}
// Solution: Use background tasks properly
func applicationDidEnterBackground(_ application: UIApplication) {
let taskID = application.beginBackgroundTask {
// Task expired, clean up
}
syncData {
application.endBackgroundTask(taskID)
}
}2. Continuous Location Updates
// Problem: Always requesting location
locationManager.startUpdatingLocation() // Continuous GPS drain
// Solution: Use appropriate accuracy
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
locationManager.distanceFilter = 100 // Update every 100m
locationManager.startMonitoringSignificantLocationChanges() // Low power mode3. Rendering Offscreen Content
// Problem: Animating hidden views
override func viewDidDisappear(_ animated: Bool) {
// Animations keep running! Wastes CPU/battery
}
// Solution: Pause animations when offscreen
override func viewDidDisappear(_ animated: Bool) {
animationView.layer.pauseAnimations()
}
extension CALayer {
func pauseAnimations() {
let pausedTime = convertTime(CACurrentMediaTime(), from: nil)
speed = 0.0
timeOffset = pausedTime
}
}Always profile on device for:
Simulator acceptable for:
Recommendation: Develop on simulator, validate on device, profile on device.
Why Profile Release Builds:
Debug vs Release Differences:
How to Profile Release:
Warning: Some crashes only happen in release due to optimizations.
Development Workflow:
CI Integration:
# .github/workflows/performance.yml
name: Performance Tests
on: [pull_request]
jobs:
performance:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Run performance tests
run: xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 15'
- name: Check for regressions
run: ./scripts/check_performance_baseline.shAutomated Performance Tests:
class PerformanceTests: XCTestCase {
func testLaunchPerformance() {
measure(metrics: [XCTApplicationLaunchMetric()]) {
XCUIApplication().launch()
}
}
func testMemoryUsage() {
let app = XCUIApplication()
app.launch()
measure(metrics: [XCTMemoryMetric()]) {
// Perform memory-intensive operations
for _ in 0..<100 {
app.buttons["Load"].tap()
}
}
}
}Establish Budgets:
// PerformanceBudgets.swift
enum PerformanceBudget {
static let launchTime: TimeInterval = 0.4 // 400ms
static let memoryFootprint: Int = 150 * 1024 * 1024 // 150MB
static let scrollFrameTime: TimeInterval = 0.0167 // 16.67ms (60 FPS)
static let networkRequestTimeout: TimeInterval = 5.0 // 5s
}
// Enforce in tests
func testLaunchBudget() {
let launchTime = measureLaunchTime()
XCTAssertLessThan(launchTime, PerformanceBudget.launchTime,
"Launch time exceeded budget: \(launchTime)s > \(PerformanceBudget.launchTime)s")
}Budget Categories:
Launch Time:
Memory:
Frame Rate:
Network:
Monitor Budgets:
This Skill integrates with xcode-workflows Skill:
Build for Profiling:
{
"operation": "build",
"scheme": "MyApp",
"configuration": "Release",
"destination": "platform=iOS,id=<device-udid>",
"options": {
"clean_before_build": true
}
}Archive for Profiling:
xcodebuild archive \
-scheme MyApp \
-configuration Release \
-archivePath ./build/MyApp.xcarchiveExport for Profiling:
xcodebuild -exportArchive \
-archivePath ./build/MyApp.xcarchive \
-exportPath ./build \
-exportOptionsPlist ExportOptions.plistxc://operations/xcode: Xcodebuild operations for profiling buildsxc://reference/instruments: Complete Instruments template referencexc://reference/performance-metrics: Key performance indicators and targetsTip: Profile on device, use Release configuration, focus on user-impacting metrics first.
© conorluddy, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/performance-profiling of conorluddy/xclaude-plugin.
Open the folder on GitHubat commit 6de4b2c
Performance Profiling next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Performance Profiling this skillconorluddy/xclaude-plugin | 183 | — | ~7.3k | Automated safety check: Pass | MIT | |
| iOS Memgraph Analysisdpearson2699/swift-ios-skills | 1.2k | — | ~2.4k | Automated safety check: Pass | Custom licence | |
| Mobile App Debuggingsecondsky/claude-skills | 227 | — | ~513 | Automated safety check: Pass | MIT | |
| Update Swiftui APIsAvdLee/SwiftUI-Agent-Skill | 3.7k | — | ~1.2k | Automated safety check: Pass | MIT | |
| iOS Simulator Skillconorluddy/ios-simulator-skill | 1.3k | — | ~5.7k | Automated safety check: Pass | MIT | |
| Inspector MCPipedro/Inspector | 170 | — | ~3.4k | Automated safety check: Pass | MIT |
dpearson2699/swift-ios-skills
A skill your agent uses when capturing or analyzing an iOS .memgraph, especially when the task mentions a memory leak, heap growth, persistent memory increase, ownership path, or matched-capture…
secondsky/claude-skills
Mobile app debugging for iOS, Android, cross-platform frameworks.
AvdLee/SwiftUI-Agent-Skill
Scan Apple's SwiftUI documentation for deprecated APIs and update the SwiftUI Expert Skill with modern replacements.
conorluddy/ios-simulator-skill
29 production-ready scripts for iOS app testing, building, and automation.
ipedro/Inspector
A skill your agent uses when an agent needs to inspect a live iOS app through the Inspector MCP bridge, register or troubleshoot InspectorMCPServer for a consumer Xcode project, or query, resolve…
pzep1/xcode-build-skill
Build and run iOS/macOS apps using xcodebuild and xcrun simctl directly.
conorluddy/xclaude-plugin
Guides WCAG 2.1 and VoiceOver accessibility testing for iOS apps, working from the accessibility tree and not from screenshots.
conorluddy/xclaude-plugin
Walks through retrieving, symbolicating and diagnosing iOS crash logs, turning a cryptic stack trace into the function names that actually failed.
conorluddy/xclaude-plugin
Manages iOS Simulator devices and apps through the execute_simulator_command MCP tool instead of raw simctl: boot, create and delete devices, install and launch apps, screenshots and diagnostics.
conorluddy/xclaude-plugin
Teaches how xc-plugin saves tokens with progressive disclosure, cached responses and consistent configuration, so large device lists and build logs arrive as summaries first.
conorluddy/xclaude-plugin
Accessibility-first UI automation using IDB. An agent skill from conorluddy/xclaude-plugin.
conorluddy/xclaude-plugin
Directs iOS build, test and clean operations through the execute_xcode_command MCP tool instead of raw xcodebuild in the shell, with parameter-level retries on failure.
Works with
Categories
Instruments integration and performance analysis workflows for iOS apps. Performance Profiling is an agent skill from conorluddy/xclaude-plugin. Instruments integration and performance analysis workflows for iOS apps.
Performance Profiling fits situations like: profiling CPU usage; memory allocation; network activity; energy consumption.
Run `npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a claude-code`. Or copy the skill folder (skills/performance-profiling in conorluddy/xclaude-plugin) into .claude/skills/performance-profiling in your project. Claude Code loads it when a task matches its description.
Run `npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a codex`. Or copy the skill folder (skills/performance-profiling in conorluddy/xclaude-plugin) into .agents/skills/performance-profiling in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add conorluddy/xclaude-plugin --skill performance-profiling -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/performance-profiling, .gemini/skills/performance-profiling, .github/skills/performance-profiling and .opencode/skills/performance-profiling in your project.
Going by SKILL.md and its folder, Performance Profiling needs the command-line tools its instructions call (xcodebuild).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Performance Profiling is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 7.3k tokens (SKILL.md is roughly 29k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Performance Profiling: iOS Memgraph Analysis (dpearson2699/swift-ios-skills, 1.2k stars), Mobile App Debugging (secondsky/claude-skills, 227 stars), Update Swiftui APIs (AvdLee/SwiftUI-Agent-Skill, 3.7k stars) and iOS Simulator Skill (conorluddy/ios-simulator-skill, 1.3k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
conorluddy (a GitHub user) maintains it in conorluddy/xclaude-plugin, which has 183 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on September 12, 2026.
Source: conorluddy/xclaude-plugin on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.