我正在一个有大量外部事件报告的应用程序中工作。经常使用的指标之一是事件率与时间的关系。例如,测量某些外部异步传感器的采样率。
目前,我这样计算事件发生频率的方法是保持事件时间戳的队列。事件发生时,我们将当前时间戳记推送到队列中,然后弹出直到最早的时间戳记小于预定义的期限。然后,事件频率与队列的大小成正比。在伪代码中,该方法通常如下所示:
def on_event():
var now = current_time()
time_queue.push(now)
while((now - time_queue.front()) > QUEUE_DEPTH_SECONDS):
time_queue.pop()
frequency = time_queue.size() / QUEUE_DEPTH_SECONDS
现在这种方法显然不是最佳方法:
我很好奇是否可以使用其他算法来计算事件的发生率,以及它们在计算复杂性,空间要求,响应时间等方面具有哪些取舍?
[另一种选择是以固定速率(例如每秒一次)触发的本地计时器:
以下是该方法与您的方法的比较:
https://en.wikipedia.org/wiki/Exponential_smoothing非常有效,并且仅使用少量有限的内存。您可以尝试对到达时间进行指数平滑。在检索平滑的到达时间之前,您可以查看到上一个事件的时间,如果大于平滑的到达时间,则将其混合。
这有很大的不同,实际上我将从收集当前使用的时间戳样本开始,以便可以离线使用它来测试此方案或其他方案的结果。