Nel caso I = 0 (dall'inizio), il modo più veloce per calcolare i valori medi è in questo modo. Dovresti quantizzare i tuoi dati in intervalli con valori discreti come
- 0 ms-1 ms = 1
- 1 ms-2 ms = 2
- ...
- 40 ms-50 ms = k
- 50 ms-70 ms = k + 1
- ...
- > 5000ms = n (anche per non aver mai risposto)
Quanto più improbabile è il valore di latenza misurato nel mondo reale, tanto più ampio dovrebbe essere l'intervallo. L'inserimento di un valore di latenza in questa mappa è il seguente:
- discreteLatencyCount [indexForDiscreteLatency (measuredLatency)] ++;
La latenza media viene quindi calcolata da:
- avg = 0.0
-
for (i = 1 a n) {avg + = weightOfDiscreteLatencyFor [i] * discreteLatencyCount [i]; }
-
weightOfDiscreteLatencyFor [] è per soluzioni semplici a metà dell'intervallo o dipende dalla distribuzione delle statistiche - Prova a registrare un set di dati abbastanza grande e ad accordare i valori per ridurre al minimo la vera differenza per questo set di dati.
Il conteggio dei messaggi viene quindi calcolato da:
* count = 0;
* for (i = 1 a n) {count + = discreteLatencyCount [i]; }
lavorare con finestre a scorrimento fisso funziona come questo, ma devi sottrarre gli eventi in uscita (che stanno lasciando la finestra scorrevole) dai tuoi contatori. Questa implementazione è una buona soluzione, se hai bisogno di un calcolo veloce (o costante) di avg e count.
Ma dipende dal tuo caso se questa soluzione è abbastanza buona per te. Invece, potresti utilizzare anche soluzioni pronte come un database round robin. Si prega inoltre di considerare i problemi di blocco negli ambienti multithread.
Sono arrivato a questa soluzione dopo che un collega del settore telco mi ha preso in giro con questa domanda qualche anno fa e poi mi ha detto che lo hanno implementato in questo modo, dopo aver presentato questa soluzione.