# Piano di Refactor: Ottimizzazione Simulatore (`Simula.cs`) **Obiettivo Primario:** Ridurre il consumo di CPU reale (visto da Proxmox) minimizzando il context switching e la saturazione dei thread, senza modificare la classe base `Generic` o l'architettura WinForms. ## Strategia di Intervento L'approccio si basa sul concetto di **"Staggering & Throttling"**: disallineare le istanze tra loro e ridurre la frequenza delle operazioni che generano traffico o context switch. ### Fase 1: Disallineamento delle Istanze (Jittering) - [COMPLETATA] Per evitare il fenomeno del "Thundering Herd" (tutte le decine di istanze che si svegliano e lavorano nello stesso millisecondo), implementeremo: - **Jitter di Inizializzazione:** Un ritardo casuale all'avvio dei task (aumentato a 10s). - **Jitter dei Periodi:** Applicazione di un rumore statistico ai periodi di esecuzione (`periodoMSec`) per evitare che le frequenze di polling si sincronizzino tra le varie VM. ### Fase 2: Riduzione del Carico di Comunicazione (Throttling I/O) - [COMPLETATA] Ridurre il numero di chiamate verso Redis e il Server MES/IO: - **Filtro "Change-Only" (Dirty Check):** Prima di chiamare metodi come `upsertKey` o `trySendPzCountBlock`, verifichiamo rigorosamente se il valore simulato è effettivamente diverso dall'ultimo valore inviato con successo (`lastSentPzCount`). - **Throttling Decodifica:** Limitazione della frequenza di `decodeToBaseBitmap` (max ogni 500ms) per evitare chiamate HTTP sincrone troppo frequenti. ### Fase 3: Ottimizzazione della Logica Interna e Async - [COMPLETATA] - **Eliminazione Sync-over-Async:** Rimozione massiccia dei pattern `.GetAwaiter().GetResult()` e `Task.Run(...).GetResult()`. - **Fire-and-Forget Controllato:** Utilizzo di `_ = Task.Run(async () => ...)` per i processi di sincronizzazione (`ProcessDataSync`) e caricamento (`Simula_Load`), evitando di bloccare i thread di polling o di sistema. - **Riduzione verbosità:** (Opzionale/In corso) Minimizzazione dei log nei cicli critici. ## Stato del Lavoro - [x] Analisi completa della gerarchia e dei colli di bottiglia. - [x] Implementazione Fase 1 (Jittering). - [x] Implementazione Fase 2 (Dirty Check I/O & Bitmap Throttling). - [x] Implementazione Fase 3 (Rimozione ponti Sync-over-Async). - [ ] Test e verifica (Simulazione in ambiente controllato). - [ ] Rollout/Test in produzione.