Files
mapo-core/MP.Data/Services/ExecStatsCollector.cs
2025-11-13 12:26:09 +01:00

124 lines
3.6 KiB
C#

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