You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
247 lines
6.7 KiB
247 lines
6.7 KiB
/*
|
|
* This is a AssemblyScript port of the original Java version, which was written by
|
|
* Gil Tene as described in
|
|
* https://github.com/HdrHistogram/HdrHistogram
|
|
* and released to the public domain, as explained at
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
import Histogram from "./Histogram";
|
|
import {
|
|
Uint8Storage,
|
|
Uint16Storage,
|
|
Uint32Storage,
|
|
Uint64Storage,
|
|
} from "./Histogram";
|
|
import { decodeFromByteBuffer } from "./encoding";
|
|
import ByteBuffer from "./ByteBuffer";
|
|
import { PackedArray } from "./packedarray/PackedArray";
|
|
|
|
export const UINT8ARRAY_ID = idof<Uint8Array>();
|
|
|
|
class HistogramAdapter<T, U> {
|
|
private _histogram: Histogram<T, U>;
|
|
constructor(
|
|
lowestDiscernibleValue: f64,
|
|
highestTrackableValue: f64,
|
|
numberOfSignificantValueDigits: f64,
|
|
autoResize: boolean,
|
|
histogram: Histogram<T, U> | null = null
|
|
) {
|
|
if (histogram) {
|
|
this._histogram = histogram;
|
|
} else {
|
|
this._histogram = new Histogram<T, U>(
|
|
<u64>lowestDiscernibleValue,
|
|
<u64>highestTrackableValue,
|
|
<u8>numberOfSignificantValueDigits
|
|
);
|
|
this._histogram.autoResize = autoResize;
|
|
}
|
|
}
|
|
|
|
public get autoResize(): boolean {
|
|
return this._histogram.autoResize;
|
|
}
|
|
|
|
public set autoResize(resize: boolean) {
|
|
this._histogram.autoResize = resize;
|
|
}
|
|
|
|
public get highestTrackableValue(): f64 {
|
|
return <f64>this._histogram.highestTrackableValue;
|
|
}
|
|
|
|
public set highestTrackableValue(value: f64) {
|
|
this._histogram.highestTrackableValue = <u64>value;
|
|
}
|
|
|
|
public get startTimeStampMsec(): f64 {
|
|
return <f64>this._histogram.startTimeStampMsec;
|
|
}
|
|
|
|
public set startTimeStampMsec(value: f64) {
|
|
this._histogram.startTimeStampMsec = <u64>value;
|
|
}
|
|
|
|
public get endTimeStampMsec(): f64 {
|
|
return <f64>this._histogram.endTimeStampMsec;
|
|
}
|
|
|
|
public set endTimeStampMsec(value: f64) {
|
|
this._histogram.endTimeStampMsec = <u64>value;
|
|
}
|
|
|
|
public get minNonZeroValue(): f64 {
|
|
return <f64>this._histogram.minNonZeroValue;
|
|
}
|
|
|
|
public get maxValue(): f64 {
|
|
return <f64>this._histogram.maxValue;
|
|
}
|
|
|
|
public get totalCount(): f64 {
|
|
return <f64>this._histogram.totalCount;
|
|
}
|
|
|
|
public get stdDeviation(): f64 {
|
|
return <f64>this._histogram.getStdDeviation();
|
|
}
|
|
|
|
public get mean(): f64 {
|
|
return <f64>this._histogram.getMean();
|
|
}
|
|
|
|
public get estimatedFootprintInBytes(): f64 {
|
|
return <f64>(
|
|
(offsetof<HistogramAdapter<T, U>>() +
|
|
this._histogram.estimatedFootprintInBytes)
|
|
);
|
|
}
|
|
|
|
recordValue(value: f64): void {
|
|
this._histogram.recordSingleValue(<u64>value);
|
|
}
|
|
|
|
recordValueWithCount(value: f64, count: f64): void {
|
|
this._histogram.recordCountAtValue(<u64>count, <u64>value);
|
|
}
|
|
|
|
recordValueWithExpectedInterval(
|
|
value: f64,
|
|
expectedIntervalBetweenValueSamples: f64
|
|
): void {
|
|
this._histogram.recordSingleValueWithExpectedInterval(
|
|
<u64>value,
|
|
<u64>expectedIntervalBetweenValueSamples
|
|
);
|
|
}
|
|
|
|
getValueAtPercentile(percentile: f64): f64 {
|
|
return <f64>this._histogram.getValueAtPercentile(percentile);
|
|
}
|
|
|
|
outputPercentileDistribution(
|
|
percentileTicksPerHalfDistance: f64,
|
|
outputValueUnitScalingRatio: f64
|
|
): string {
|
|
return this._histogram.outputPercentileDistribution(
|
|
<i32>percentileTicksPerHalfDistance,
|
|
outputValueUnitScalingRatio
|
|
);
|
|
}
|
|
|
|
copyCorrectedForCoordinatedOmission(
|
|
expectedIntervalBetweenValueSamples: f64
|
|
): HistogramAdapter<T, U> {
|
|
const copy = this._histogram.copyCorrectedForCoordinatedOmission(
|
|
<u64>expectedIntervalBetweenValueSamples
|
|
);
|
|
|
|
return new HistogramAdapter<T, U>(0, 0, 0, false, copy);
|
|
}
|
|
|
|
addHistogram8(otherHistogram: Histogram8): void {
|
|
this._histogram.add(otherHistogram._histogram);
|
|
}
|
|
addHistogram16(otherHistogram: Histogram16): void {
|
|
this._histogram.add(otherHistogram._histogram);
|
|
}
|
|
addHistogram32(otherHistogram: Histogram32): void {
|
|
this._histogram.add(otherHistogram._histogram);
|
|
}
|
|
addHistogram64(otherHistogram: Histogram64): void {
|
|
this._histogram.add(otherHistogram._histogram);
|
|
}
|
|
addPackedHistogram(otherHistogram: PackedHistogram): void {
|
|
this._histogram.add(otherHistogram._histogram);
|
|
}
|
|
|
|
subtractHistogram8(otherHistogram: Histogram8): void {
|
|
this._histogram.subtract(otherHistogram._histogram);
|
|
}
|
|
subtractHistogram16(otherHistogram: Histogram16): void {
|
|
this._histogram.subtract(otherHistogram._histogram);
|
|
}
|
|
subtractHistogram32(otherHistogram: Histogram32): void {
|
|
this._histogram.subtract(otherHistogram._histogram);
|
|
}
|
|
subtractHistogram64(otherHistogram: Histogram64): void {
|
|
this._histogram.subtract(otherHistogram._histogram);
|
|
}
|
|
subtractPackedHistogram(otherHistogram: PackedHistogram): void {
|
|
this._histogram.subtract(otherHistogram._histogram);
|
|
}
|
|
|
|
encode(): Uint8Array {
|
|
return this._histogram.encode();
|
|
}
|
|
|
|
reset(): void {
|
|
this._histogram.reset();
|
|
}
|
|
}
|
|
|
|
export class Histogram8 extends HistogramAdapter<Uint8Storage, u8> {}
|
|
export class Histogram16 extends HistogramAdapter<Uint16Storage, u16> {}
|
|
export class Histogram32 extends HistogramAdapter<Uint32Storage, u32> {}
|
|
export class Histogram64 extends HistogramAdapter<Uint64Storage, u64> {}
|
|
export class PackedHistogram extends HistogramAdapter<PackedArray, u64> {}
|
|
|
|
function decodeHistogram<T, U>(
|
|
data: Uint8Array,
|
|
minBarForHighestTrackableValue: f64
|
|
): HistogramAdapter<T, U> {
|
|
const buffer = new ByteBuffer(data);
|
|
const histogram = decodeFromByteBuffer<T, U>(
|
|
buffer,
|
|
<u64>minBarForHighestTrackableValue
|
|
);
|
|
return new HistogramAdapter<T, U>(0, 0, 0, false, histogram);
|
|
}
|
|
|
|
export function decodeHistogram8(
|
|
data: Uint8Array,
|
|
minBarForHighestTrackableValue: f64
|
|
): HistogramAdapter<Uint8Storage, u8> {
|
|
return decodeHistogram<Uint8Storage, u8>(
|
|
data,
|
|
minBarForHighestTrackableValue
|
|
);
|
|
}
|
|
export function decodeHistogram16(
|
|
data: Uint8Array,
|
|
minBarForHighestTrackableValue: f64
|
|
): HistogramAdapter<Uint16Storage, u16> {
|
|
return decodeHistogram<Uint16Storage, u16>(
|
|
data,
|
|
minBarForHighestTrackableValue
|
|
);
|
|
}
|
|
export function decodeHistogram32(
|
|
data: Uint8Array,
|
|
minBarForHighestTrackableValue: f64
|
|
): HistogramAdapter<Uint32Storage, u32> {
|
|
return decodeHistogram<Uint32Storage, u32>(
|
|
data,
|
|
minBarForHighestTrackableValue
|
|
);
|
|
}
|
|
export function decodeHistogram64(
|
|
data: Uint8Array,
|
|
minBarForHighestTrackableValue: f64
|
|
): HistogramAdapter<Uint64Storage, u64> {
|
|
return decodeHistogram<Uint64Storage, u64>(
|
|
data,
|
|
minBarForHighestTrackableValue
|
|
);
|
|
}
|
|
export function decodePackedHistogram(
|
|
data: Uint8Array,
|
|
minBarForHighestTrackableValue: f64
|
|
): HistogramAdapter<PackedArray, u64> {
|
|
return decodeHistogram<PackedArray, u64>(
|
|
data,
|
|
minBarForHighestTrackableValue
|
|
);
|
|
}
|