【发布时间】:2019-11-21 00:19:33
【问题描述】:
我正在使用 LatencyUtils 包来跟踪和报告跨测量的延迟行为:
用这种方法记录时间,时间单位应该是纳秒,但在我的例子中,记录的时间是以毫秒为单位的。 我想知道是否有更好的方法以毫秒为单位记录时间?
我现在使用的解决方案是将所有记录的时间乘以一百万。但我还是希望结果以微秒为单位,所以对于我得到的结果,我除以一百万。
public void addValue(Long val, long sampleCount) {
sum += val * sampleCount;
for (int i = 0; i < sampleCount; i++) {
latencyStats.recordLatency(val*1000000);
}
histogram.add(latencyStats.getIntervalHistogram());
max = Math.max(val, max);
min = Math.min(val, min);
updateValueCount(val,sampleCount);
}
@Override
public double getStandardDeviation() {
return histogram.getStdDeviation()/1000000;
}
而LatencyUtil的默认构造函数是这样的:
private long lowestTrackableLatency = 1000L; /* 1 usec */
private long highestTrackableLatency = 3600000000000L; /* 1 hr */
private int numberOfSignificantValueDigits = 2;
private int intervalEstimatorWindowLength = 1024;
private long intervalEstimatorTimeCap = 10000000000L; /* 10 sec */
private PauseDetector pauseDetector = null;
public LatencyStats() {
this(
defaultBuilder.lowestTrackableLatency,
defaultBuilder.highestTrackableLatency,
defaultBuilder.numberOfSignificantValueDigits,
defaultBuilder.intervalEstimatorWindowLength,
defaultBuilder.intervalEstimatorTimeCap,
defaultBuilder.pauseDetector
);
}
所以,事实上,LatencyUtil 的最低可跟踪延迟也是纳秒级。如果我以毫秒为单位放一个值,恐怕会影响记录的结果。
【问题讨论】:
-
这里的实际单位不重要吗?我认为您可以跳过乘法和除法结果,只要您记得以纳秒为单位显示结果。如果您以小时为单位记录值,则同样如此,无需手动乘法或除法。
-
@M.Prokhorov,令人不安的是,recordLatency 文档提到以纳秒为单位
-
@UBIKLOADPACK,据我了解,他们并不关心实际的 UOM。他们只接受整数并用它们做一些计算。他们关心的可能是几年或皮秒,计算不会改变。我的理解是,他们在最佳可用时间源精度的背景下提到 nanos。
-
@M.Prokhorov,如果你确定你的答案,为什么不创建一个答案而不是评论,我很乐意提供赏金。谢谢
-
@UBIKLOADPACK,那是因为我不确定我的答案,当我第一次阅读这个问题时,我了解了那个库,我对它的全部了解来自阅读它的 javadoc 和源代码。像往常一样,当我这样评论时。
标签: java latency hdrhistogram latencyutils