package de.invesdwin.util.lang; import javax.annotation.concurrent.Immutable; import de.invesdwin.util.math.decimal.Decimal; import de.invesdwin.util.time.Instant; import de.invesdwin.util.time.duration.Duration; import de.invesdwin.util.time.fdate.FTimeUnit; @Immutable public class ProcessedEventsRateString { private final long countEvents; private final Duration duration; public ProcessedEventsRateString(final long countEvents, final Duration duration) { this.countEvents = countEvents; this.duration = duration; } public ProcessedEventsRateString(final long countEvents, final Instant startInstant, final Instant endInstant) { this.countEvents = countEvents; this.duration = new Duration(startInstant, endInstant); } @Override public String toString() { if (countEvents == 0) { return "0/s"; } final double milliseconds = duration.doubleValue(FTimeUnit.MILLISECONDS); if (milliseconds <= 0D) { return "0/s"; } final double ratePerMillisecond = countEvents / milliseconds; if (ratePerMillisecond < 10 && duration.isGreaterThan(Duration.ONE_SECOND)) { final double seconds = duration.doubleValue(FTimeUnit.SECONDS); final double ratePerSecond = countEvents / seconds; return new Decimal(ratePerSecond).round(2) + "/s"; } else { return new Decimal(ratePerMillisecond).round(2) + "/ms"; } } }