我正在使用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
?
答案 0 :(得分:1)
HdrHistograms设置为最低可配置精度(例如2个小数点或3个或...)。作为数据结构,它使用逻辑指数存储桶,每个存储桶中都有线性子存储桶,以在整个动态范围内保持所需的精度,所有这些都在固定大小(对于给定的动态范围和精度级别)数据结构内。因此,直方图中记录的任何整数值都不能与lowerEquivalentValue(value).. highestEquivalentValue(value)范围内的任何其他值区分开。
HdrHistogram小心避免在范围内提供任何结果。当要求输入最小值时,它将始终以等于最低记录值的值进行响应。当要求最大值时,它将始终以等于最高记录值的值进行响应。这些答案显然在精确度合同之内,否则将导致“令人惊讶的”行为,例如遍历最小值或最大值,或者获得报告范围之外的查询答案(均值,百分位数等)。最小。最大范围。
HTH。
答案 1 :(得分:0)
在HDR直方图GitHub上有一些conversation后,我认为一个原因可能是确保最小值与桶上的迭代结果匹配。