gpt4 book ai didi

c# - 计算每秒调用该方法多少次的最佳方法

转载 作者:太空狗 更新时间:2023-10-29 17:43:43 25 4
gpt4 key购买 nike

我有一个应该是“QoSed”的 dll 方法 - 这个方法应该每秒最多调用 100 次。:

    private static extern int ExecTrans(int connectionId);

这个方法在程序中只用了一个地方所以qos这个地方就可以了。我需要为每个 connectionId 单独的“qos 计数器”。所以 ExecTrans(1)ExecTrans(2) 应该去不同的柜台。

在第一次迭代时,我想计算调用方法的频率(对于每个 connectionId)。 IE。我想要“实时统计”。有两种方法:

- allow to exceed limitiation for a short period. for example allow "100 transaction from 0 to 1 second, 100 transaction from 1 to 2 seconds and 200 transactions from 0.5 to 1.5 second".
- at any second interval transactions should not exceed 100.

现在我不关心使用这些方法中的哪一种,但我会选择一种产生较少“开销”的方法。我希望 qos 添加尽可能少的“额外工作”,因为它是对每 0.1 毫秒敏感一次的交易软件。

至于第一种方法,我认为我可以使用类似的东西(伪代码,可能 statscurStats 应该是线程安全的):

private int[] stats      // statistic to display to user
private int[] curStats; // statistic currently collection

OnOneSecondElapsed(object source, ElapsedEventArgs args) {
foreach (conId : connIds) {
stats[conId] = curStats[conId];
curStats[conId] = 0;
}
}

myMethod {
......
ExecTrans(conId);
++curStats[conId];
......
}

至于第二种方法....是否有可能创建一个集合,其中对象只存在一秒钟,然后在一秒钟后消失?然后每次我都会将下一个对象添加到集合中,除非集合包含 100 个对象。

你怎么看?我不熟悉 C# 库文件,所以我可能缺少一些有用的类,也许你可以建议另一种方法。

最佳答案

第一种方法:

  • 使用 ConcurrentQueue<DateTime>
  • 在每个请求之前,检查队列的大小。如果 > 100,则取消请求
  • 如果 < 100,将当前 DateTime 加入队列并执行请求
  • 在后台线程中,每 0.1 秒删除早于 1 秒的条目

它应该相当有效,但是:

  • 由于在检查队列计数和入队时间之间没有锁定,因此有时每秒可能会收到略高于 100 个请求
  • 由于后台线程每 0.1 秒执行一次,如果您同时收到 100 个请求,它可能会阻塞队列长达 1.1 秒。根据需要调整 sleep 时间。

我可能是错的,但我认为没有完美的解决方案。基本上,系统越精确,开销就越大。您必须根据需要调整参数。

关于c# - 计算每秒调用该方法多少次的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8449025/

25 4 0
文章推荐: angular - 类型 'concatMap' 上不存在属性 'Observable'?