← スキル一覧に戻る

ultra-performance-resilience-specialist
by F4TB0Yz
⭐ 0🍴 0📅 2026年1月25日
SKILL.md
name: Ultra-Performance & Resilience Specialist description: Experto en optimización de bajo nivel. Su misión es garantizar 60 FPS constantes, gestión de memoria eficiente mediante Isolates y disponibilidad offline total.
Responsabilidad Única
Optimización de rendimiento a nivel técnico. NO incluye features de negocio, UI/UX específico, ni integraciones de servicios externos.
Objetivo de Performance
- 60 FPS constantes: Ninguna operación debe bloquear el UI thread
- Memoria eficiente: Liberar recursos no utilizados proactivamente
- Battery optimization: Minimizar uso de CPU/GPU en background
- Smooth animations: Todas las animaciones deben ser fluidas sin drops
Isolates para Operaciones Pesadas
Cuándo Usar Isolates
- Decodificación de JSONs grandes (>100KB)
- Cálculos matemáticos complejos (optimización de rutas)
- Procesamiento de imágenes
- Búsquedas en listas grandes (>1000 items)
- Mapeo de datos pesados entre capas (Data → Domain)
Implementación con Isolate.run()
// Para operaciones one-shot
final result = await Isolate.run(() {
// Operación pesada aquí
return heavyComputation(data);
});
Isolates de Larga Duración
// Para operaciones continuas (ej: procesamiento de stream)
final receivePort = ReceivePort();
await Isolate.spawn(_isolateEntry, receivePort.sendPort);
static void _isolateEntry(SendPort sendPort) {
// Lógica del isolate
}
Reglas de Isolates
- Nunca pasar objetos complejos entre isolates, solo primitivos o JSON
- Usar
compute()para operaciones simples (wrapper de Isolate.run) - Cerrar isolates cuando no se necesiten para liberar memoria
Optimización de Widgets
RepaintBoundary
Aplicar en widgets que se redibujan frecuentemente pero son independientes:
// En mapas
RepaintBoundary(
child: MapWidget(...),
)
// En animaciones complejas
RepaintBoundary(
child: AnimatedNeonGlow(...),
)
// En listas con items complejos
ListView.builder(
itemBuilder: (context, index) {
return RepaintBoundary(
child: ComplexListItem(...),
);
},
)
Const Widgets
- Uso obligatorio de
consten widgets estáticos - Reduce rebuilds innecesarios
- Mejora performance de comparación de widgets
// ✅ Correcto
const Text('Label');
const Icon(Icons.check);
// ❌ Incorrecto
Text('Label');
Icon(Icons.check);
Keys para Optimización
ValueKey: Para items en listas que pueden reordenarseGlobalKey: Solo cuando necesites acceder al state desde fuera (usar con moderación)ObjectKey: Para items complejos en listas
Optimización de Rebuilds
Provider/Riverpod Optimization
// ✅ Escuchar solo lo necesario
final name = ref.watch(userProvider.select((user) => user.name));
// ❌ Escuchar todo el objeto
final user = ref.watch(userProvider);
Bloc Optimization
// Usar Equatable para comparación eficiente
class PackageState extends Equatable {
final List<Package> packages;
@override
List<Object?> get props => [packages];
}
Evitar Rebuilds Innecesarios
- Extraer widgets que no dependen del estado
- Usar
constconstructors - Implementar
shouldRebuilden custom widgets cuando sea necesario
Gestión de Memoria
Dispose de Recursos
@override
void dispose() {
_controller.dispose();
_subscription.cancel();
_focusNode.dispose();
super.dispose();
}
Streams y Subscriptions
- Siempre cancelar subscriptions en
dispose() - Usar
StreamSubscriptionpara mantener referencia - Considerar
StreamBuilderpara manejo automático
Imágenes
// Usar cache de imágenes
Image.network(
url,
cacheWidth: 400, // Limitar tamaño en memoria
cacheHeight: 400,
)
// Limpiar cache cuando sea necesario
imageCache.clear();
Lazy Loading y Pagination
Lazy Loading de Listas
ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) {
// Solo construir items visibles
return ItemWidget(items[index]);
},
)
Infinite Scroll
ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
_scrollController.addListener(_onScroll);
}
void _onScroll() {
if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent * 0.8) {
// Cargar más items
_loadMore();
}
}
Optimización de Animaciones
GPU Acceleration
// Usar Transform en lugar de Container para animaciones
Transform.translate(
offset: Offset(x, y),
child: child,
)
// Usar Opacity con cuidado (costoso)
// Preferir AnimatedOpacity que optimiza internamente
AnimatedOpacity(
opacity: isVisible ? 1.0 : 0.0,
duration: Duration(milliseconds: 300),
child: child,
)
Curves Optimizadas
- Usar curves predefinidas (más eficientes que custom)
Curves.easeOutQuintpara transiciones suaves- Evitar curves muy complejas en animaciones continuas
Profiling y Debugging
Performance Overlay
// En MaterialApp
MaterialApp(
showPerformanceOverlay: true, // Solo en debug
// ...
)
DevTools
- Timeline: Identificar frames lentos (>16ms)
- Memory: Detectar memory leaks
- CPU Profiler: Identificar funciones costosas
Logging de Performance
import 'dart:developer' as developer;
void measurePerformance(String name, Function() fn) {
final stopwatch = Stopwatch()..start();
fn();
stopwatch.stop();
developer.log('$name took ${stopwatch.elapsedMilliseconds}ms');
}
Optimización de JSON Parsing
Usar Isolates para JSON Grande
Future<List<Package>> parsePackages(String jsonString) async {
return await Isolate.run(() {
final List<dynamic> jsonList = jsonDecode(jsonString);
return jsonList.map((json) => PackageModel.fromJson(json).toEntity()).toList();
});
}
Code Generation
- Usar
json_serializablepara parsing eficiente - Evitar parsing manual cuando sea posible
Battery Optimization
Location Updates
// Ajustar frecuencia según necesidad
LocationSettings(
accuracy: LocationAccuracy.high,
distanceFilter: 10, // Solo actualizar cada 10 metros
timeLimit: Duration(seconds: 5), // Timeout
)
Background Tasks
- Minimizar trabajo en background
- Usar
WorkManagerpara tareas diferibles - Pausar animaciones cuando app está en background
Checklist de Optimización
Antes de considerar una feature "completa", verificar:
- No hay operaciones pesadas en UI thread
- Isolates usados para JSON parsing >100KB
- RepaintBoundary en widgets complejos/animados
- Const usado en todos los widgets estáticos
- Subscriptions canceladas en dispose()
- Imágenes con cacheWidth/cacheHeight
- Lazy loading implementado en listas largas
- Animaciones usando Transform (GPU accelerated)
- 60 FPS en dispositivos de gama media
- Sin memory leaks detectados en DevTools
Ejemplo de Implementación Optimizada
class OptimizedPackageList extends StatefulWidget {
const OptimizedPackageList({super.key});
@override
State<OptimizedPackageList> createState() => _OptimizedPackageListState();
}
class _OptimizedPackageListState extends State<OptimizedPackageList> {
final ScrollController _scrollController = ScrollController();
@override
void initState() {
super.initState();
_scrollController.addListener(_onScroll);
}
@override
void dispose() {
_scrollController.dispose();
super.dispose();
}
void _onScroll() {
if (_scrollController.position.pixels >=
_scrollController.position.maxScrollExtent * 0.8) {
// Load more
}
}
@override
Widget build(BuildContext context) {
return ListView.builder(
controller: _scrollController,
itemCount: packages.length,
itemBuilder: (context, index) {
return RepaintBoundary(
key: ValueKey(packages[index].id),
child: const PackageCard(package: packages[index]),
);
},
);
}
}
スコア
総合スコア
50/100
リポジトリの品質指標に基づく評価
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
レビュー
💬
レビュー機能は近日公開予定です