getPerformanceStats method

Map<String, dynamic> getPerformanceStats()

Obtener estadísticas de rendimiento

Implementation

Map<String, dynamic> getPerformanceStats() {
  if (_eventHistory.isEmpty) return {};

  // Estadísticas a nivel de evento
  final eventDurations = _eventHistory
      .where((e) => e.totalDurationMs != null)
      .map((e) => e.totalDurationMs!)
      .toList();

  // Estadísticas a nivel de regla
  final ruleDurations = <int>[];
  for (final event in _eventHistory) {
    for (final rule in event.ruleExecutions) {
      if (rule.durationMs != null) {
        ruleDurations.add(rule.durationMs!);
      }
    }
  }

  final stats = <String, dynamic>{};

  if (eventDurations.isNotEmpty) {
    eventDurations.sort();
    final avgEvent =
        eventDurations.reduce((a, b) => a + b) / eventDurations.length;
    final medianEvent = eventDurations[eventDurations.length ~/ 2];
    final p95Event =
        eventDurations[(eventDurations.length * 0.95).round() - 1];

    stats['event_stats'] = {
      'average_duration_ms': avgEvent,
      'median_duration_ms': medianEvent,
      'p95_duration_ms': p95Event,
      'min_duration_ms': eventDurations.first,
      'max_duration_ms': eventDurations.last,
    };
  }

  if (ruleDurations.isNotEmpty) {
    ruleDurations.sort();
    final avgRule =
        ruleDurations.reduce((a, b) => a + b) / ruleDurations.length;
    final medianRule = ruleDurations[ruleDurations.length ~/ 2];
    final p95Rule = ruleDurations[(ruleDurations.length * 0.95).round() - 1];

    stats['rule_stats'] = {
      'average_duration_ms': avgRule,
      'median_duration_ms': medianRule,
      'p95_duration_ms': p95Rule,
      'min_duration_ms': ruleDurations.first,
      'max_duration_ms': ruleDurations.last,
    };
  }

  return stats;
}