HDR 直方图:1 个样本计数的最小值与最大值不同

HDR Histogram: Min not same as Max on 1 sample count

我正在使用 Java HDR 直方图的实现:

    <dependency>
        <groupId>org.hdrhistogram</groupId>
        <version>2.1.4</version>
        <artifactId>HdrHistogram</artifactId>
    </dependency>

我注意到即使样本数为 1,最小值和最大值也不同:

@Test
public void testHistogram() throws Exception {
    Histogram stats = new Histogram(2);

    stats.recordValue(35071);
    assertEquals(1, stats.getTotalCount());
    assertEquals(35071, stats.getMaxValue());

    assertEquals(35071, stats.getMinNonZeroValue()); // Fails:
               // java.lang.AssertionError: 
               // Expected :35071
               // Actual   :34816


}

我在直方图代码中看到以下片段:

public long getMinNonZeroValue() {
    return (minNonZeroValue == Long.MAX_VALUE) ?
            Long.MAX_VALUE : lowestEquivalentValue(minNonZeroValue);
}

(即在GitHub)

我的问题是:为什么我们不能简单地return记录minNonZeroValue

在 HDR 直方图 GitHub 上进行一些 conversation 之后,我认为一个原因可能是要确保最小值与桶上迭代的结果相匹配。

HdrHistograms 设置了最小可配置精度(例如 2 个小数点,或 3 个,或...)。作为一种数据结构,它使用逻辑指数桶,每个桶中都有线性子桶,以在整个动态范围内保持所需的精度,所有这些都在固定大小(对于给定的动态范围和精度级别)数据结构内。因此,直方图中记录的任何整数值都无法与 lowestEquivalentValue(value)..highestEquivalentValue(value).

范围内的任何其他值区分开来

HdrHistogram 小心地避免提供任何结果 "within" 范围。当询问最小值时,它将始终以等于最低记录值的值作为响应。当询问最大值时,它将始终以等于最高记录值的值作为响应。这些答案显然在精度合同内,否则会导致 "subtly surprising" 行为,例如迭代最小值或最大值,或获取超出精度合同的查询答案(对于均值、百分位数等)报告的最小..最大范围。

HTH.