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

时间:2016-06-21 17:15:53

标签: java hdrhistogram

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

    <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

我的问题是:为什么我们不能简单地返回录制的minNonZeroValue

2 个答案:

答案 0 :(得分:1)

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

HdrHistogram小心避免在范围内提供任何结果。当要求输入最小值时,它将始终以等于最低记录值的值进行响应。当要求最大值时,它将始终以等于最高记录值的值进行响应。这些答案显然在精确度合同之内,否则将导致“令人惊讶的”行为,例如遍历最小值或最大值,或者获得报告范围之外的查询答案(均值,百分位数等)。最小。最大范围。

HTH。

答案 1 :(得分:0)

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