【问题标题】:Reporting operations per time interval in C#在 C# 中报告每个时间间隔的操作
【发布时间】:2012-07-29 00:40:02
【问题描述】:

我有一系列事件,在高峰时间可能每秒数百个。我希望能够跟踪和报告每个时间间隔的事件数(例如,过去 5 分钟、过去 1 小时、过去 24 小时、过去 7 天)。在 C# 中跟踪此类数据的一些选项是什么

【问题讨论】:

  • 你在说什么事件?
  • 好吧,举个例子,假设我正在接收“Hello World!”的纯文本消息。类型。我只想知道如何报告在给定时间段内我收到了多少条消息。
  • 这些消息是如何被接收的?您是否有一个对某些事件做出反应的 EventHandler,或者您是否接收到存储在文件中的字符串?
  • 我通过网络流接收这些消息。目前,它们被存储在内存中,等待更有效的管理方式。
  • 我的回答是否没有提供解决此问题所需的工具?如果您在网络上记录所有事件,您可以在需要时分析日志并根据您的问题规范输出事件频率。

标签: c# time-series


【解决方案1】:

考虑到到目前为止我所知道的你的问题,我将简单地分别用整数变量或长变量来计算接收到的事件的数量。

要计算特定时间段内的事件而无需手头的项目时间戳,您必须先确定时间粒度并根据结果时间范围跟踪传入事件。要测量经过的时间,您可以使用并发线程。

这意味着如果您决定以 5 分钟为粒度,您将必须实现一个维护一个计数器的线程。此计数器在每个传入事件时递增。每 5 分钟线程会将当前计数器存储在列表中并将其重置为 0。 说 60 分钟后,您将获得一个包含 12 个项目的列表,反映收到的消息数量。使用该列表,您可以处理类似的查询

  • 前 5 分钟有多少事件?
  • 前 10 分钟有多少事件?
  • 接收 15 分钟后 5 分钟内有多少事件。
  • ...

从那时起,只需解释随时间收集并存储到列表中的计数器。


另一方面如果您希望能够查询任何粒度的时间间隔(意味着后验决定您想知道收到多少事件的时间间隔),我认为您没有其他选择来维护带有时间戳的数据结构。

因此,对于每个事件,您都必须存储收到的时间,以便回答上述查询。如果您每秒收到数百个事件,那可能不是一个好主意。

【讨论】:

  • 当然,如果事件具有有限粒度是可以的,但日志记录可以在任何粒度上工作,这是动态决定的。当然,所有这些都取决于实际的问题参数。
  • @Michael 但是,如果您想过滤具有任何时间间隔粒度的日志(实际上不会在此问题/答案的上下文中退出),我认为除了使用时间戳之外别无选择每个接收到的事件都会被存储。如果 OP 每秒接收数百个事件,那么性能确实可能会降低。
  • 我完全同意,正确的答案取决于更重要的是什么——性能与粒度。我们的两个答案可能都是正确的,这取决于对 OP 更重要的是什么。
  • @Michael 是的,我完全同意你的看法 :)
【解决方案2】:

根据问题描述,我假设您想要监控系统性能、负载和吞吐量。如果是这样,我想你可以使用 WMI。

很抱歉我不能提供更详细的信息,但我想你可以从这里开始:http://msdn.microsoft.com/en-us/library/ms186147%28v=vs.80%29

【讨论】:

    【解决方案3】:

    我建议为事件分配一个时间戳。我想你会继续以任何方式处理这些事件。因此,您可能会以某种方式存储事件和/或其数据。只需通过时间戳成员扩展数据结构并在事件发生时添加时间戳。 这样,您可以在稍后的某个时间点在您的代码中的某个时间点构建您的“传入”统计信息。您可以简单地评估在特定时间范围内发生了哪些事件。

    作为合理时间戳的来源,我建议使用GetSystemTimeAsFileTime() API。当您的最大事件率高达每秒几百个时,这应该能够提供唯一值。但是,当时间戳的目的仅仅是为了说明它们落在哪个时间范围内时,时间戳不必具有唯一值。当需要更高的分辨率时,请查看 QueryPerformanceCounter() API 可能会有所帮助。此处描述的两个 API 的组合可以导致时间戳分辨率几微秒的精度。

    【讨论】:

      【解决方案4】:

      这里有一个两阶段的问题 - 记录事件并呈现它们。如果您跟踪上个月的所有事件,您可以选择仅显示过去 5 分钟、过去 7 天内发生的事件,或者甚至更复杂的事件,例如“12 天凌晨 1 点到下午 3 点之间的所有事件”以前”。

      可以在here 找到一些 .NET 的日志记录选项。祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-22
        • 2023-04-10
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多