0

我正在使用 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

4

2 回答 2

2

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

HdrHistogram 小心地避免提供“范围内”的任何结果。当询问最小值时,它总是会以等于最低记录值的值进行响应。当询问最大值时,它总是会以与记录的最高值相等的值响应。这些答案显然在精确合同之内,否则会导致“微妙地令人惊讶”的行为,例如迭代超过最小值或最大值,或获得超出报告范围的查询答案(平均值、百分位数等)最小..最大范围。

HTH。

于 2019-01-02T07:51:34.650 回答
0

在 HDR Histogram GitHub 上进行了一番讨论后,我认为一个原因可能是确保最小值与桶迭代的结果相匹配。

于 2016-06-22T13:32:41.560 回答