Feature: Detaillierte Worker-Pool Performance-Metriken mit psutil

Neue Metrik-Erfassung für Saxon- und FOP-Worker-Pools:
- Kompilierungszeit der Java-Worker-Klassen
- Worker-Startzeiten (Summe + Durchschnitt pro Worker)
- RAM-Verbrauch vor/nach Transformation (Summe + Durchschnitt)
- Automatische Berechnung der RAM-Zunahme in MB und Prozent

Technische Details:
- Neue WorkerPoolMetrics-Datenklasse in worker_metrics.py
- RAM-Messung via psutil (v7.2.1, neu hinzugefügt)
- Metriken für beide Saxon-Varianten (JAXP + s9api)
- WorkerPoolMetricsDialog mit Tab-basierter UI
- Menüeintrag "Projekt → Worker-Pool-Metriken"

Metriken werden automatisch erfasst:
- Bei Worker-Pool-Initialisierung (Kompilierung + Start)
- Vor erster Transformation (RAM-Baseline)
- Nach allen Transformationen (RAM-Endwert)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-06 20:58:37 +01:00
parent cfbdc476fa
commit d3dc07cbf3
8 changed files with 624 additions and 12 deletions
+62
View File
@@ -0,0 +1,62 @@
"""
Worker Pool Performance-Metriken.
Gemeinsame Datenstrukturen für Performance- und Ressourcenverbrauch-Metriken
der Worker-Pools (Saxon, FOP).
"""
from dataclasses import dataclass, field
@dataclass
class WorkerPoolMetrics:
"""
Metriken für Worker-Pool Performance und Ressourcenverbrauch.
"""
# Kompilierungszeit
compilation_time_seconds: float = 0.0
# Worker-Start-Zeiten
worker_start_times: list[float] = field(default_factory=list)
total_worker_start_time_seconds: float = 0.0
average_worker_start_time_seconds: float = 0.0
# RAM-Verbrauch (in MB)
ram_before_transform_mb_per_worker: list[float] = field(default_factory=list)
ram_after_transform_mb_per_worker: list[float] = field(default_factory=list)
total_ram_before_mb: float = 0.0
total_ram_after_mb: float = 0.0
average_ram_before_mb: float = 0.0
average_ram_after_mb: float = 0.0
# XSL-Kompilierungszeiten (nur für Saxon)
xsl_compilation_times: list[float] = field(default_factory=list)
total_xsl_compilation_time_seconds: float = 0.0
average_xsl_compilation_time_seconds: float = 0.0
def calculate_aggregates(self):
"""Berechnet aggregierte Werte (Summen, Durchschnitte)."""
# Worker-Start-Zeiten
if self.worker_start_times:
self.total_worker_start_time_seconds = sum(self.worker_start_times)
self.average_worker_start_time_seconds = self.total_worker_start_time_seconds / len(
self.worker_start_times
)
# RAM vor Transformation
if self.ram_before_transform_mb_per_worker:
self.total_ram_before_mb = sum(self.ram_before_transform_mb_per_worker)
self.average_ram_before_mb = self.total_ram_before_mb / len(self.ram_before_transform_mb_per_worker)
# RAM nach Transformation
if self.ram_after_transform_mb_per_worker:
self.total_ram_after_mb = sum(self.ram_after_transform_mb_per_worker)
self.average_ram_after_mb = self.total_ram_after_mb / len(self.ram_after_transform_mb_per_worker)
# XSL-Kompilierungszeiten
if self.xsl_compilation_times:
self.total_xsl_compilation_time_seconds = sum(self.xsl_compilation_times)
self.average_xsl_compilation_time_seconds = self.total_xsl_compilation_time_seconds / len(
self.xsl_compilation_times
)