c# - 在紧密循环中交错更新 .net 字典

标签 c# .net optimization collections

我正在开发一个应用程序,它以我称之为相当高的吞吐量(当前峰值在 400 Mbps 范围内,最终设计目标为 10 Gbps)进行处理。

我运行了一个循环的多个实例,基本上只是循环读取和处理信息,并使用字典来保存状态。但是,我还需要定期扫描整个字典以检查超时,并且我想征求一些关于如果此扫描成为性能热点时该怎么做的想法。基本上,我正在寻找的是,是否有任何标准技术可以交错字典的超时检查,循环中的主要处理代码,所以说在循环 1 上我检查第一个字典项,循环 2,第二个等等。此外,字典键发生变化,将在主处理代码中删除和添加,因此它不像复制所有字典键然后在主循环中一个一个地检查它们那么简单.

我重申一下,这不是当前的性能问题。因此,请不要对过早的优化发表评论,我意识到这还为时过早,我有意识地选择将此视为一个潜在问题。

为清楚起见进行编辑:这对我来说是一种好奇心,我在周末思考它,以及对于这样的事情来说最佳实践方法可能是什么。这不是我遇到的唯一问题,也不是我关注的唯一性能领域。然而,这是一个我并没有真正意识到一种简洁明了的方法来解决这个问题的领域。

我已经在这方面利用了并行性和硬件(下一级别的硬件成本增加了 5 倍,但更重要的是需要重新设计并行性)。并行性也按照我想要的方式工作,所以再次强调,没有必要对此发表评论。字典是按线程实例化的,因此运行检查的任何其他线程都需要线程之间的同步,这成本太高。

逻辑的一些伪代码,如果有帮助的话:

Dictionary hashdb;
while(true) {
  grab_record_from_buffer(); // There is a buffer in place, so some delays are tolerable
  process(record);  //do the main processing
  update_hashdb();  //Add,remove,update entries in the dictionary
  if(last_scan > 15 seconds)
    foreach(entry in hashdb)
      periodic_check(entry);  //check for timeouts or any other periodic checks on every db entry
}

我确实意识到我的使用方式可能不会遇到实际问题,因此很可能出现的任何问题都不需要使用。但是,我真正要寻找的是是否有任何标准方法或算法可以将字典扫描与主要处理逻辑交织在一起,我只是不知道(而且字典正在改变)。或者对此方法的任何建议(我已经知道我将如何处理它,但它并不像我想要的那么干净)。

谢谢你,

最佳答案

您是否能够使用 .NET 4.0(或至少计划这样做)?如果是这样, ConcurrentDictionary 可能对您有帮助 - 它允许您在修改字典的同时迭代它(在同一个线程或不同的线程中)。

您需要意识到结果可能会令人惊讶 - 例如,您可能会看到一些变化但看不到其他变化 - 但如果这是可以接受的,它可能是一种有用的方法。

然后您可以让一个线程对所有其他词典进行定期检查。我知道您之前由于同步要求而排除了这一点,但是 ConcurrentDictionary 的美妙之处在于是它不需要同步1。这会改变使用单独检查线程的可行性吗?

如果您不想使用单独的线程,您可以显式地使用迭代器 - 每次执行循环时,检查另一个条目,如果已​​经到达终点则重新开始。同样,这不适用于标准词典,但应该适用于 ConcurrentDictionary。 - 只要您愿意接受同时看到更新数据和陈旧数据的可能性。


1 ...我的意思是它不需要任何显式同步,而且内部同步比必须在每次访问时都锁定要轻得多。

来自 Stephen Toub's post on ConcurrentDictionary :

For modifications / writes to the dictionary, ConcurrentDictionary employs fine-grained locking to ensure thread-safety (reads on the dictionary are performed in a lock-free manner)

锁定的另一大减少是上面提到的能力:您可以在一个线程中迭代字典,同时在另一个线程中修改它,只要您能够应付自创建迭代器以来应用的某些更改而不是其他更改。将此与正常 Dictionary<,> 进行比较为了安全并发访问,您必须在迭代字典的整个过程中锁定字典。

关于c# - 在紧密循环中交错更新 .net 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350565/

相关文章:

c# - .NET OneDrive Api 创建文件夹问题

c# - C++ 和 C# 中的等效系统时钟毫秒数?

c# - 在 Entity Framework Core 的不同方法中使用相同的事务

python - 优化大量数据的搜索和插入操作

c - 为大整数加速 "base conversion"

c# - 跟踪用户点数(如 SO)

c# - 没有证书的 TransportWithMessageCredential 对于 WCF 服务是否足够安全?

c# - 如何暂停控件及其子项的绘制?

.net - F#-解析日期

php - 大数据集的流程优化