| | |
| | | * Benchmark application framework. |
| | | */ |
| | | abstract class PerformanceRunner implements ConnectionEventListener { |
| | | private static final class ResponseTimeBuckets { |
| | | static final class ResponseTimeBuckets { |
| | | private static final long NS_1_US = NANOSECONDS.convert(1, MICROSECONDS); |
| | | private static final long NS_100_US = NANOSECONDS.convert(100, MICROSECONDS); |
| | | private static final long NS_1_MS = NANOSECONDS.convert(1, MILLISECONDS); |
| | |
| | | * @return array of response times in microseconds corresponding to |
| | | * percentiles. |
| | | */ |
| | | private List<Long> getPercentile(double[] percentiles, long nbData) { |
| | | List<Long> getPercentile(double[] percentiles, long nbData) { |
| | | List<Long> responseTimes = new ArrayList<Long>(); |
| | | Queue<Long> nbDataThresholds = new LinkedList<Long>(); |
| | | long nbDataSum = nbData; |
| | |
| | | |
| | | private void computePercentiles(Queue<Long> currentDataThreshold, List<Long> responseTimes, long currentSum, |
| | | long currentETime) { |
| | | while (currentDataThreshold.peek() != null && currentDataThreshold.peek() > currentSum) { |
| | | while (currentDataThreshold.peek() != null && currentDataThreshold.peek() >= currentSum) { |
| | | responseTimes.add(currentETime); |
| | | currentDataThreshold.poll(); |
| | | } |
| | | } |
| | | |
| | | private void addTimeToInterval(long responseTimeNanoSecs) { |
| | | void addTimeToInterval(long responseTimeNanoSecs) { |
| | | if (responseTimeNanoSecs >= NS_5_S) { |
| | | long matchingKey = responseTimeNanoSecs / NS_100_MS; |
| | | matchingKey -= matchingKey % 5; |
| | |
| | | } |
| | | } |
| | | |
| | | //To allow tests |
| | | static ResponseTimeBuckets getResponseTimeBuckets() { |
| | | return new ResponseTimeBuckets(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * Statistics thread base implementation. |