2

我有一个具有以下属性的测量列表:

  1. 测量是昂贵的。更少的测量 -> 更好
  2. 他们都是积极的。事实上,有一个正的下限,我无法得到任何低于该值的值。这个下限是我需要有信心知道的。
  3. 它们将分布在一个或多个中值附近
  4. 我知道当我发现一个离群值小于时,还有另一个“更好”的中位数,median - 2*variance因为“最佳”中位数和下限之间的距离总是小于正态分布宽度的两倍

目标:找到具有最少迭代次数的最佳中位数,置信度为 90%。

我更喜欢最小值,但最小的中位数就足够了。

我正在寻找的是一段代码,我在其中提供测量值,它告诉我中位数以及这个中位数是我寻找的那个的信心。

背景:我想计时Java方法。我可以运行几分钟的测试来平均异常值,但是在查看数据时,对于人类来说,很明显这些值会迅速累积在中值附近。

除非 JIT 启动并且中位数突然跳跃。最终,您将得到一条在最小中位数左侧非常陡峭的曲线(即,中位数左侧的方差很低)和右侧的长而柔和的斜坡,其中 pre-JIT 有一个凸起中位数是。

样本测试数据 (13KB)

testConnect-count.csv是值的直方图,testConnect-history.csv是测量序列。目标是找到一种算法,该算法115000通过从testConnect-history.csv

4

2 回答 2

1

我相信实际的问题是:给我一个子程序在经过 JIT 优化后的平均执行情况。

该过程不是静止的。JIT 启动的时间取决于实际的虚拟机实现和被测程序。我相信您不会找到通用的魔术子弹方法。

你必须试验。我会尝试丢弃固定数量的测量值,进行固定数量的测量,丢弃异常值,取其余值的平均值。

于 2012-09-13T20:16:26.930 回答
1

我认为查看延迟百分位数的常见做法是,因为它们不遵循正态分布,而且延迟时间较长会伤害您。

在您的情况下,您可以使用第 50 个百分位和第 90 个百分位。

如果你有一个排序的集合,这些很容易计算

List<Long> times = ....
Collections.sort(times);
long median = times.get(times.size()/2);
long ninetyth = times.get(times.size()*9/10);

我使用 trove,因为这对于时间敏感的测试更有效。它使用原始值而不是创建对象。

TLongArrayList times = 
times.sort();
long median = times.get(times.size()/2);
long ninetyth = times.get(times.size()*9/10);
long ninetynineth = times.get(times.size()*99/100);

在您的情况下,中位数是 116000,90% 的平铺是 170000。99% 的平铺是 255000

于 2012-09-13T15:53:22.820 回答