Algorithm 如果一个函数在一秒钟内被调用超过一百万次,则打印一个错误

Algorithm 如果一个函数在一秒钟内被调用超过一百万次,则打印一个错误,algorithm,data-structures,Algorithm,Data Structures,一个类中有一个函数,如果它在一秒钟内被调用超过一百万次,我们需要打印一个错误。这基本上是一个我们应该使用什么方法的设计问题 我正在考虑使用一个时间计数器和一个计数变量。每当计数变量的值超过一百万或每秒之后,时间计数器都会重置计数变量。如果您在0.1秒内收到900K个调用,然后计数器通过计时器重置,然后在0.1秒内收到另一个900K个调用,则您将在一秒内收到180万个调用,但您将无法打印错误 我会这样做: 每100K次呼叫,读取时钟并将时间存储在循环缓冲区中 在缓冲区中保留10次,以便在至少1M

一个类中有一个函数,如果它在一秒钟内被调用超过一百万次,我们需要打印一个错误。这基本上是一个我们应该使用什么方法的设计问题


我正在考虑使用一个时间计数器和一个计数变量。每当计数变量的值超过一百万或每秒之后,时间计数器都会重置计数变量。

如果您在0.1秒内收到900K个调用,然后计数器通过计时器重置,然后在0.1秒内收到另一个900K个调用,则您将在一秒内收到180万个调用,但您将无法打印错误

我会这样做:

  • 每100K次呼叫,读取时钟并将时间存储在循环缓冲区中
  • 在缓冲区中保留10次,以便在至少1M次呼叫后,无论何时添加新时间,它都会替换先前1M次呼叫中的一次。如果这些时间之间的差异小于1秒,则应打印错误
在最坏的情况下,你仍然可以在一秒钟内接到多达110万个电话而不会引起错误,但这可能已经足够接近了。如果需要更高的精度,可以使用更多的缓冲区插槽和更小的批处理

  • 我认为我们可以使用一个全局变量“count”来保持函数调用的频率,该频率可以在函数本身内部更新
  • 在开始之前,我们还需要有一个全局变量“start_time”,最初在第一次调用函数时,我们必须将其设置为当前系统时间
  • 因此,如果计数达到100万,则获取当前系统时间的时间戳,并使用“开始时间”检查差异,如果差异小于1秒,则打印错误,否则不执行任何操作
  • 在这两种情况下,我们现在将“计数”和“开始时间”重置为当前系统时间和1

  • 这是“节流”的常见用例。只是不要检查每次调用的时间!我有一个类似的解决方案。缓冲区的大小不是随机的(如本答案中的10),而是取决于所需的时间精度。如果所需精度为0.05秒,则制作1/0.05=20的缓冲区。这将提供更好的结果,但可能会占用更多内存。缓冲槽的数量决定计数精度,而不是时间精度。