Sto tentando di calcolare 95th Percentile
dai set di dati che ho inserito nel mio sotto ConcurrentHashMap
.
Sono interessato a scoprire quante chiamate sono arrivate nel 95 ° percentile di tempo
La mia mappa sarà simile a questa e sarà sempre ordinata in ordine crescente sui tasti- in cui
key - means number of milliseconds
value - means number of calls that took that much milliseconds
Milliseconds Number
0 1702
1 15036
2 14262
3 13190
4 9137
5 5635
6 3742
7 2628
8 1899
9 1298
10 963
11 727
12 503
13 415
14 311
15 235
16 204
17 140
18 109
19 83
20 72
Ad esempio, dai set di dati sopra, significa
1702 calls came back in 0 milliseconds
15036 calls came back in 1 milliseconds
Ora posso calcolare il 95 ° percentile collegando i set di dati sopra indicati in Excel sheet
. Ma stavo pensando di calcolare il percentile nel codice Java.
So che l'algoritmo sarà simile a questo -
Sommare tutti i valori dalla mappa, calcolare il 95% della somma, scorrere le chiavi della mappa in ordine crescente mantenendo un totale parziale di valori e quando la somma equivale o supera il 95% precedentemente calcolato della somma totale, la chiave deve essere il 95 ° percentile credo.
Ma non sono in grado di collegare questo algoritmo nel codice Java. Di seguito è riportata la mappa che avrà sopra i set di dati.
Map<Long, Long> histogram = new ConcurrentHashMap<Long, Long>
Non sono sicuro di quale sia il modo migliore per calcolare il percentile in Java. Non sono sicuro che l'algoritmo sia corretto o meno. Sto solo cercando di scoprire quante chiamate sono arrivate nel 95 ° percentile di tempo.
private static void calculatePercentile() {
for (Long time : CassandraTimer.histogram.keySet()) {
}
}
Qualcuno può fornire qualche esempio su come farlo?
Qualsiasi aiuto sarà apprezzato.
Codice aggiornato: -
Di seguito è riportato il codice che ho ottenuto finora. Fammi sapere se ho ottenuto tutto corretto nel calcolo del 95 ° percentile -
/**
* A simple method to log 95th percentile information
*/
private static void logPercentileInfo() {
double total = 0;
for (Map.Entry<Long, Long> entry : CassandraTimer.histogram.entrySet()) {
long value = entry.getKey() * entry.getValue();
total += value;
}
double sum = 0.95*total;
double totalSum = 0;
SortedSet<Long> keys = new TreeSet<Long>(CassandraTimer.histogram.keySet());
for (long key : keys) {
totalSum += CassandraTimer.histogram.get(key);
if(totalSum >= sum) {
//this is the 95th percentile I guess
System.out.println(key);
}
}
}