using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MP.Data.Services { /// /// Gestore statistiche esecuzione processi x analisi timing /// public class ExecStatsCollector : IDisposable { #region Public Methods public void Dispose() { TrackData.Clear(); } /// /// restituisce una stringa da poter emettere in log con il summary degli eventi tracciati ed eventuale reset... /// /// /// /// public string GetCallSum(string CallName, bool resetCount) { string answ = ""; if (TrackData.ContainsKey(CallName)) { var reqRec = TrackData[CallName]; answ = $"{CallName} | {reqRec.NumCall} x {reqRec.AvgTime:N3}ms | min: {reqRec.MinTime:N3}ms | MAX: {reqRec.MaxTime:N3}ms"; // se richiede reset --> effettuo if (resetCount) { TrackData[CallName].ListMsRec = new List(); } } return answ; } /// /// Accumula record di tracciamento info esecuzione e restituisce numero elementi finali /// /// nome chiamata da registrare /// Durata in ms /// public int RecordCall(string CallName, double msDuration) { if (TrackData.ContainsKey(CallName)) { TrackData[CallName].ListMsRec.Add(msDuration); } else { TrackData.Add(CallName, new RecordData() { ListMsRec = new List() { msDuration } }); } return TrackData[CallName].NumCall; } #endregion Public Methods #region Public Classes /// /// Record atomico informazioni x un dato task tracciato /// public class RecordData { #region Public Properties /// /// Tempo medio /// public double AvgTime { get => ListMsRec.Sum(x => x) / (NumCall > 0 ? NumCall : 1); } /// /// Lista registrazioni di tempi esecuzione in ms /// public List ListMsRec { get; set; } = new List(); /// /// Tempo Massimo /// public double MaxTime { get => ListMsRec.OrderByDescending(x => x).FirstOrDefault(); } /// /// Tempo minimo /// public double MinTime { get => ListMsRec.OrderBy(x => x).FirstOrDefault(); } /// /// numero registrazioni disponibili /// public int NumCall { get => ListMsRec.Count(); } #endregion Public Properties } #endregion Public Classes #region Private Fields /// /// Dizionario di dati statistici accumulati /// private Dictionary TrackData = new Dictionary(); #endregion Private Fields } }