package org.sef4j.callstack.stats.dto; import org.sef4j.callstack.stats.BasicTimeStatsLogHistogram; import org.sef4j.callstack.stats.ThreadTimeUtils; import org.sef4j.core.helpers.proptree.model.PropTreeValueMapper.AbstractTypedPropTreeValueMapper; import org.sef4j.core.util.ICopySupport; /** * DTO for BasicTimeStatsLogHistogram * <br/> * values are slightly transformed, by applying partial cumulated sums, and converting nanos to millis * <br/> * for total count, use cumulated[N] * cumulated[i] = sum for all calls faster than i-th slot * * cumulated[0] = src.count[0] * cumulated[1] = src.count[1] + cumulated[0] * cumulated[2] = src.count[2] + cumulated[1] = src.count[0] + src.count[1] + src.count[2] * .. * cumulated[N] = src.count[N] + cumulated[N-1] * * * see BasicTimeStatsLogHistogram */ public final class CumulatedBasicTimeStatsLogHistogramDTO implements ICopySupport<CumulatedBasicTimeStatsLogHistogramDTO> { /** * slot count */ public static final int SLOT_LEN = 10; public static final int MAX_SLOT_INDEX = SLOT_LEN - 1; /** * cumulated occurrence count per elapsed time using histogram slots * cumulated[0] = src.count[0] * cumulated[1] = src.count[1] + cumulated[0] * cumulated[2] = src.count[2] + cumulated[1] = src.count[0] + src.count[1] + src.count[2] * .. * cumulated[N] = src.count[N] + cumulated[N-1] */ private int[] cumulatedCountSlots = new int[SLOT_LEN]; /** * cumulated sum of elapsed time in millis using histogram slots * * cumulated[0] = src.count[0] * cumulated[1] = src.count[1] + cumulated[0] * cumulated[2] = src.count[2] + cumulated[1] = src.count[0] + src.count[1] + src.count[2] * .. * cumulated[N] = src.count[N] + cumulated[N-1] * */ private long[] cumulatedSumSlots = new long[SLOT_LEN]; // ------------------------------------------------------------------------ public CumulatedBasicTimeStatsLogHistogramDTO() { } public CumulatedBasicTimeStatsLogHistogramDTO(CumulatedBasicTimeStatsLogHistogramDTO src) { set(src); } public CumulatedBasicTimeStatsLogHistogramDTO(BasicTimeStatsLogHistogram src) { incr(src); } public static final class CumulatedBasicTimeStatsLogHistogramDTOMapper extends AbstractTypedPropTreeValueMapper<BasicTimeStatsLogHistogram,CumulatedBasicTimeStatsLogHistogramDTO> { public static final CumulatedBasicTimeStatsLogHistogramDTOMapper INSTANCE = new CumulatedBasicTimeStatsLogHistogramDTOMapper(); public CumulatedBasicTimeStatsLogHistogramDTO mapProp(BasicTimeStatsLogHistogram src) { return new CumulatedBasicTimeStatsLogHistogramDTO(src); } } // ------------------------------------------------------------------------ /** @return sum of values in all slots */ public long totalSum() { return cumulatedSumSlots[MAX_SLOT_INDEX]; } /** @return sum of counts in all slots */ public int totalCount() { return cumulatedCountSlots[MAX_SLOT_INDEX]; } public long cumulatedSumAt(int i) { return cumulatedSumSlots[i]; } public int cumulatedCountAt(int i) { return cumulatedCountSlots[i]; } public int[] getCumulatedCountSlots() { return cumulatedCountSlots; } public long[] getCumulatedSumSlots() { return cumulatedSumSlots; } public void incr(BasicTimeStatsLogHistogram src) { int cumulCount = 0; long cumulSum = 0; for (int i = 0; i < SLOT_LEN; i++) { cumulCount += src.getCount(i); cumulSum += ThreadTimeUtils.nanosToMillis(src.getSum(i)); cumulatedCountSlots[i] = cumulCount; cumulatedSumSlots[i] = cumulSum; } } public void incr(CumulatedBasicTimeStatsLogHistogramDTO src) { for (int i = 0; i < SLOT_LEN; i++) { cumulatedCountSlots[i] += src.cumulatedCountSlots[i]; cumulatedSumSlots[i] += src.cumulatedSumSlots[i]; } } @Override /* java.lang.Object */ public CumulatedBasicTimeStatsLogHistogramDTO clone() { return copy(); } @Override /* ICopySupport<> */ public CumulatedBasicTimeStatsLogHistogramDTO copy() { return new CumulatedBasicTimeStatsLogHistogramDTO(this); } public void set(CumulatedBasicTimeStatsLogHistogramDTO src) { System.arraycopy(src.cumulatedCountSlots, 0, cumulatedCountSlots, 0, SLOT_LEN); System.arraycopy(src.cumulatedSumSlots, 0, cumulatedSumSlots, 0, SLOT_LEN); } public boolean compareHasChangeCount(CumulatedBasicTimeStatsLogHistogramDTO cmp) { // heuristic: compare total instead of comparing all values return totalCount() != cmp.totalCount(); } @Override public String toString() { long totalCount = totalCount(); long avg = (totalCount != 0)? totalSum()/totalCount : 0; return "CumulatedPerfStatsHistogram [" + "total count:" + totalCount + ", avg:" + avg + "]"; } }