Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Mobile app performance analysis and optimization
.claude/skills/a5c-ai-mobile-performance-profiling/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 51% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-16 | ✓→✗ | ▼ Worse | 88% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 51% | 0% |
This skill provides mobile app performance analysis and optimization capabilities. It enables profiling with Xcode Instruments, Android Profiler, Flipper, and Flutter DevTools to identify and fix performance issues.
bash - Execute profiling tools and build commandsread - Analyze performance reports and profileswrite - Generate optimization configurationsedit - Update performance-related codeglob - Search for performance filesgrep - Search for patternsmobile-performance-optimization.js - Performance tuningmobile-testing-strategy.js - Performance testingjetpack-compose-ui.js - Compose optimizationswiftui-app-development.js - SwiftUI optimizationbash# Record Time Profiler trace xcrun xctrace record --device "iPhone 15 Pro" \ --template "Time Profiler" \ --attach "MyApp" \ --time-limit 30s \ --output ~/Desktop/profile.trace # Export trace data xcrun xctrace export --input ~/Desktop/profile.trace \ --xpath '/trace-toc/run/tracks/track[@name="Time Profiler"]' \ --output ~/Desktop/profile_data.xml
bash# Capture CPU trace adb shell am profile start com.example.myapp /data/local/tmp/profile.trace # Stop and pull trace adb shell am profile stop com.example.myapp adb pull /data/local/tmp/profile.trace ./profile.trace # Capture heap dump adb shell am dumpheap com.example.myapp /data/local/tmp/heap.hprof adb pull /data/local/tmp/heap.hprof ./heap.hprof
typescript// Optimize list rendering import { FlashList } from '@shopify/flash-list'; const OptimizedList = () => { const renderItem = useCallback(({ item }) => ( <MemoizedListItem item={item} /> ), []); return ( <FlashList data={items} renderItem={renderItem} estimatedItemSize={100} keyExtractor={item => item.id} /> ); }; // Memoize expensive components const MemoizedListItem = memo(({ item }) => { return ( <View style={styles.item}> <Text>{item.title}</Text> </View> ); }, (prev, next) => prev.item.id === next.item.id); // Optimize images import FastImage from 'react-native-fast-image'; const OptimizedImage = ({ uri }) => ( <FastImage source={{ uri, priority: FastImage.priority.normal }} resizeMode={FastImage.resizeMode.cover} style={styles.image} /> );
swift// Optimize view updates struct OptimizedView: View { @State private var items: [Item] = [] var body: some View { List { ForEach(items) { item in ItemRow(item: item) .equatable() // Prevent unnecessary redraws } } } } // Use Equatable for custom views struct ItemRow: View, Equatable { let item: Item static func == (lhs: ItemRow, rhs: ItemRow) -> Bool { lhs.item.id == rhs.item.id } var body: some View { Text(item.title) } } // Lazy loading struct LazyImageView: View { let url: URL var body: some View { AsyncImage(url: url) { phase in switch phase { case .empty: ProgressView() case .success(let image): image.resizable().aspectRatio(contentMode: .fit) case .failure: Image(systemName: "photo") @unknown default: EmptyView() } } } }
kotlin// Optimize recomposition @Composable fun OptimizedList(items: List<Item>) { LazyColumn { items( items = items, key = { it.id } ) { item -> // Stable key prevents unnecessary recomposition ItemCard(item = item) } } } // Use derivedStateOf for computed values @Composable fun SearchableList(items: List<Item>, query: String) { val filteredItems by remember(items, query) { derivedStateOf { items.filter { it.title.contains(query, ignoreCase = true) } } } LazyColumn { items(filteredItems, key = { it.id }) { ItemCard(it) } } } // Use remember for expensive calculations @Composable fun ExpensiveView(data: ComplexData) { val processedData = remember(data) { expensiveCalculation(data) } Text(processedData.result) }
mobile-testing - Performance testingreact-native-dev - RN optimizationflutter-dart - Flutter optimizationkotlin-compose - Compose optimization| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 9,941 | 33,239 | +234% | 1 | 1 | 0% | 2,071 | 3,122 | +51% | 0 | 0 | — |
case-02 | pass→pass | 9,868 | 4,452 | -55% | 1 | 1 | 0% | 1,827 | 2,652 | +45% | 0 | 0 | — |
case-03 | pass→pass | 11,418 | 5,643 | -51% | 1 | 1 | 0% | 2,041 | 2,901 | +42% | 0 | 0 | — |
case-04 | pass→pass | 13,251 | 12,388 | -7% | 1 | 1 | 0% | 2,418 | 4,119 | +70% | 0 | 0 | — |
case-05 | pass→pass | 13,507 | 13,266 | -2% | 1 | 1 | 0% | 2,704 | 3,874 | +43% | 0 | 0 | — |
case-06 | pass→pass | 7,689 | 7,663 | -0% | 1 | 1 | 0% | 1,393 | 3,215 | +131% | 0 | 0 | — |
case-07 | pass→pass | 8,894 | 4,869 | -45% | 1 | 1 | 0% | 1,613 | 2,612 | +62% | 0 | 0 | — |
case-08 | pass→pass | 9,556 | 11,145 | +17% | 1 | 1 | 0% | 1,825 | 3,923 | +115% | 0 | 0 | — |
case-09 | pass→pass | 5,395 | 7,209 | +34% | 1 | 1 | 0% | 1,027 | 2,977 | +190% | 0 | 0 | — |
case-10 | fail→pass | 15,351 | 12,467 | -19% | 1 | 1 | 0% | 2,793 | 4,219 | +51% | 0 | 0 | — |
case-11 | pass→pass | 12,471 | 10,895 | -13% | 1 | 1 | 0% | 2,239 | 3,745 | +67% | 0 | 0 | — |
case-12 | fail→pass | 18,890 | 12,020 | -36% | 1 | 1 | 0% | 2,629 | 3,509 | +33% | 0 | 0 | — |
case-13 | pass→pass | 5,053 | 1,943 | -62% | 1 | 1 | 0% | 906 | 2,086 | +130% | 0 | 0 | — |
case-14 | fail→pass | 8,983 | 9,182 | +2% | 1 | 1 | 0% | 1,549 | 3,238 | +109% | 0 | 0 | — |
case-15 | pass→pass | 8,042 | 5,510 | -31% | 1 | 1 | 0% | 1,079 | 2,660 | +147% | 0 | 0 | — |
case-16 | pass→fail | 16,486 | 19,236 | +17% | 1 | 1 | 0% | 2,421 | 4,555 | +88% | 0 | 0 | — |
case-17 | pass→pass | 5,006 | 5,069 | +1% | 1 | 1 | 0% | 901 | 2,586 | +187% | 0 | 0 | — |
case-18 | pass→pass | 7,232 | 8,347 | +15% | 1 | 1 | 0% | 1,239 | 3,134 | +153% | 0 | 0 | — |
case-19 | pass→pass | 8,432 | 7,023 | -17% | 1 | 1 | 0% | 1,511 | 2,911 | +93% | 0 | 0 | — |
case-20 | pass→pass | 13,177 | 15,854 | +20% | 1 | 1 | 0% | 2,672 | 4,920 | +84% | 0 | 0 | — |
case-21 | pass→pass | 13,764 | 16,409 | +19% | 1 | 1 | 0% | 2,789 | 5,454 | +96% | 0 | 0 | — |
case-22 | pass→pass | 16,965 | 20,292 | +20% | 1 | 1 | 0% | 3,381 | 5,118 | +51% | 0 | 0 | — |
case-23 | pass→pass | 16,603 | 18,200 | +10% | 1 | 1 | 0% | 3,188 | 5,505 | +73% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.