← Назад к вопросам

Какие знаешь инструменты для для анализа performance?

2.2 Middle🔥 161 комментариев
#Flutter виджеты#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие знаешь инструменты для анализа performance

Для оптимизации Flutter приложений существует множество встроенных и сторонних инструментов анализа производительности. Рассмотрю самые эффективные.

1. DevTools — встроенное решение Flutter

Главный инструмент для анализа performance.

# Запустить приложение с профилированием
flutter run --profile

# Откроется DevTools в браузере
http://localhost:9100

Memory Tab (анализ памяти)

// Плохо — утечка памяти
class BadWidget extends StatefulWidget {
  @override
  State createState() => _BadWidgetState();
}

class _BadWidgetState extends State<BadWidget> {
  StreamSubscription? sub;
  
  @override
  void initState() {
    super.initState();
    sub = stream.listen((_) {}); // Забыли отписаться!
  }
  
  @override
  void dispose() {
    // sub?.cancel(); // ❌ Забыли
    super.dispose();
  }
}

В DevTools → Memory видны:

  • Размер Heap
  • Garbage Collection события
  • Утечки памяти

Performance Tab (производительность)

  • Frame Rate — FPS (60 FPS идеально)
  • Jank — пропуск кадров (плохо)
  • Build time — время перестройки UI
  • Paint time — время рисования

CPU Tab (использование CPU)

  • Какие методы занимают больше всего времени
  • Call stack анализ
  • Time breakdown

2. Profiler API — программный анализ

import 'dart:developer' as developer;

class PerformanceMonitor {
  static void analyzeOperation(String name, Future Function() operation) async {
    final timeline = developer.Timeline.startSync(name);
    
    try {
      await operation();
    } finally {
      timeline.finishSync();
    }
  }
  
  static void measureBuild() {
    developer.Timeline.instantSync('build_started');
    // ... код ...
    developer.Timeline.instantSync('build_finished');
  }
}

// Использование
PerformanceMonitor.analyzeOperation('fetch_data', () async {
  await api.fetchData();
});

3. Flutter Benchmark — тестирование производительности

# Создание benchmark теста
flutter test --profile
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  group('Performance', () {
    testWidgets('List build performance', (tester) async {
      final watch = Stopwatch()..start();
      
      await tester.pumpWidget(
        MaterialApp(
          home: Scaffold(
            body: ListView.builder(
              itemCount: 1000,
              itemBuilder: (context, index) => ListTile(
                title: Text('Item $index'),
              ),
            ),
          ),
        ),
      );
      
      watch.stop();
      expect(watch.elapsedMilliseconds, lessThan(1000));
    });
  });
}

4. Dart Observatory (VM Service)

Низкоуровневый анализ работы Dart VM.

# Получить URL Observatory
flutter run -v | grep "Observatory"

Возможности:

  • CPU профилирование
  • Memory анализ
  • GC статистика
  • Isolate мониторинг

5. Lighthouse для веб-версии

# Если приложение работает как веб
flutter build web
# Проверить в Chrome DevTools → Lighthouse

6. Custom Performance Monitoring

class PerformanceTracker {
  static final _metrics = <String, List<Duration>>{};
  
  static Future<T> track<T>(String name, Future<T> Function() fn) async {
    final stopwatch = Stopwatch()..start();
    
    try {
      return await fn();
    } finally {
      stopwatch.stop();
      _metrics.putIfAbsent(name, () => []).add(stopwatch.elapsed);
      
      // Логирование
      _logMetric(name, stopwatch.elapsed);
    }
  }
  
  static void _logMetric(String name, Duration duration) {
    print('$name: ${duration.inMilliseconds}ms');
  }
  
  static Map<String, double> getAverages() {
    return _metrics.map(
      (name, durations) => MapEntry(
        name,
        durations.fold<int>(0, (sum, d) => sum + d.inMilliseconds) /
            durations.length,
      ),
    );
  }
}

// Использование
await PerformanceTracker.track('api_call', () => api.fetchUsers());
await PerformanceTracker.track('database_query', () => db.getAllUsers());

print(PerformanceTracker.getAverages());
// Вывод: {api_call: 234.5, database_query: 12.3}

7. Leak Canary (для Android)

Анализ утечек памяти в нативном коде.

# Добавить в build.gradle
dependencies {
  debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

8. Android Profiler

Для нативной части приложения:

# Запустить в Android Studio
# View → Tool Windows → Profiler

Анализирует:

  • CPU использование
  • Memory leak
  • GPU рендеринг
  • Battery drain
  • Network

Практический пример оптимизации

// ❌ Плохая производительность
class BadListView extends StatelessWidget {
  final List<User> users = List.generate(10000, (i) => User(id: i));
  
  @override
  Widget build(BuildContext context) {
    return ListView(
      children: [
        ...users.map((user) => UserTile(user: user)), // Все элементы в памяти!
      ],
    );
  }
}

// ✅ Хорошая производительность
class GoodListView extends StatelessWidget {
  final List<User> users = List.generate(10000, (i) => User(id: i));
  
  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: users.length,
      itemBuilder: (context, index) => UserTile(user: users[index]),
    );
  }
}

Чек-лист оптимизации

  1. DevTools Memory — нет утечек памяти?
  2. DevTools Performance — 60 FPS?
  3. DevTools CPU — нет долгих операций?
  4. Build time — < 1000ms на rebuild?
  5. Paint time — < 16ms (60fps = 16ms per frame)?
  6. ListView — использую builder вместо children?
  7. Images — кеширую картинки?
  8. Animations — использую SingleTickerProviderStateMixin?
  9. State — правильно структурирую состояние?
  10. Disposable — очищаю ресурсы в dispose()?

Типичные проблемы и решения

Проблема            | Решение
--------------------|------------------------
Wide builds         | Использовать const widgets
Jank                | Переместить вычисления в background
Memory leak         | Disposed все в dispose()
Low FPS             | Оптимизировать build() метод
Large bundle size   | Tree-shake, проверить assets
Slow app start      | Ленивая инициализация

Правильное использование этих инструментов позволяет создавать высокопроизводительные приложения Flutter.