C#由同一类的多个实例处理一堆数据



我们有一个web应用程序作为工作角色C#.NET在Azure云中运行。该应用程序的一部分是解密不同对象中的许多短字符串(每个请求大约2000个)。我们希望它尽可能快,我们需要以正确的方式管理多线程。

我们实现它的方式是,每个对象都创建类的新实例,新线程来解密该字符串。但这花了太多时间。

如果我们只构造类的一个实例并通过它运行所有数据,那么速度会快得多,而不是为每个对象一遍又一遍地构造它。

问题是,如何改进这一点。我们想做这样的事情,但不知道如何:

  1. 我们希望创建要解密的数据池
  2. 创建同一类的多个实例(最好是每个CPU核心一个实例)作为每个核心一个线程
  3. 有某种机制向这些实例提供数据
  4. 当池为空时,关闭所有线程

我们不想为池中的每个对象启动新的线程,但有有限数量的线程并行运行,以提供相同的数据列表并逐个处理它。


更新1:

我们已经尝试了评论中提到的方法,特别是存储队列和Web作业,但由于我们的代码结构,需要进行重大更改才能实现,但结果不确定。所以这不是路。

最后我们做了以下,我将在最后分享结果:

我们正在使用AES 256创建12个"解密或"-解密实例。数字12只是最高值,实际上只有4-6个实例是基于负载创建的。实例的关闭是在主队列耗尽时完成的。

所有需要解密的对象都在队列中,每个"解密或"实例都有自己的假想队列。因此,我们正在处理来自主队列的对象,并在假想队列中搜索对象数为0或对象数最少的"解密或"。

结果

获取花费最多时间的所有方法,这是我们的参考:

  1. 原始实现:6.39秒/CPU 16核100%负载
  2. 使用一个"解密器"实例实现:1.62秒/16核CPU负载50-60%
  3. 12个"解密或"实例:1.27秒/16核CPU负载20-25%

正如你所看到的,与单实例实现相比,我们能够减少21%的时间,但我们更多地减少了CPU使用,因此我们将努力在不影响速度的情况下减少内核。

下一步将进行更大的性能测试,看看这种方法的局限性是什么。

答案正在更新:

我们正在使用AES 256创建12个"解密或"-解密实例。数字12只是最高值,实际上只有4-6个实例是基于负载创建的。实例的关闭是在主队列耗尽时完成的。

所有需要解密的对象都在队列中,每个"解密或"实例都有自己的假想队列。因此,我们正在处理来自主队列的对象,并在假想队列中搜索对象数为0或对象数最少的"解密或"。

最新更新