C# 通过相同 class 的多个实例处理一堆数据
C# Processing bunch of data by multiple instances of same class
我们在 Azure 云中有 Web 应用程序 运行ning 作为辅助角色 C#.NET。此应用程序的一部分是破译不同对象中的大量短字符串(每个请求大约 2000 个)。我们想让它尽可能快,我们需要以正确的方式管理多线程。
我们实现它的方式是每个对象创建 class 的新实例,新线程来解密该字符串。但是花了太多时间。
如果我们只构造 class 的一个实例并 运行 所有数据都通过它,它会快得多,而不是为每个对象一遍又一遍地构造它。
问题是,如何改进它。我们想做这样的事情,但不知道怎么做:
- 我们要创建要解密的数据池
- 创建相同 class 的多个实例(最好每个 CPU 核心一个)作为每个核心一个线程。
- 有某种机制来为这些实例提供数据
- 当池为空时,关闭所有线程。
我们不想为池中的每个对象启动新线程,但线程数量有限运行并行处理相同的数据列表并逐一处理。
更新 1:
我们已经尝试过评论中提到的方法,尤其是存储队列和 Web 作业,但由于我们代码的结构,实施时必须进行重大更改,但结果不确定。所以这是不可能的。
最后我们做了如下,最后分享结果:
我们正在创建 "decrypt-or" 的 12 个实例 - 使用 AES 256 解密实例。数字 12 只是最高值,实际上根据负载只创建 4 - 6 个实例。当主队列耗尽时关闭实例。
所有需要解密的对象都在队列中,"decrypt-or"的每个实例都有自己的假想队列。因此,我们正在处理来自主队列的对象,并在假想队列中搜索具有 0 个对象或对象数最少的 "decrypt-or"。
结果
获取所有耗时最多的方法作为我们的参考:
- 原始实现:6.39 秒/CPU在 16 个内核上加载 100%
- 使用 "decrypt-or" 的一个实例实施:1.62 秒/CPU 在 16 个内核上负载 50 - 60%
- 12 个 "decrypt-or" 实例:1.27 秒/CPU 在 16 个内核上负载 20 - 25%
如您所见,与单实例实施相比,我们能够减少 21% 的时间,但更多的是我们减少了 CPU 使用,因此我们将尝试在不影响速度的情况下减少内核。
下一步将进行更大规模的性能测试,以了解这种方法的局限性。
答案正在更新中:
我们正在创建 "decrypt-or" 的 12 个实例 - 使用 AES 256 解密实例。数字 12 只是最高值,实际上根据负载只创建 4 - 6 个实例。当主队列耗尽时关闭实例。
所有需要解密的对象都在队列中,"decrypt-or"的每个实例都有自己的假想队列。因此,我们正在处理来自主队列的对象,并在假想队列中搜索具有 0 个对象或对象数最少的 "decrypt-or"。
我们在 Azure 云中有 Web 应用程序 运行ning 作为辅助角色 C#.NET。此应用程序的一部分是破译不同对象中的大量短字符串(每个请求大约 2000 个)。我们想让它尽可能快,我们需要以正确的方式管理多线程。
我们实现它的方式是每个对象创建 class 的新实例,新线程来解密该字符串。但是花了太多时间。
如果我们只构造 class 的一个实例并 运行 所有数据都通过它,它会快得多,而不是为每个对象一遍又一遍地构造它。
问题是,如何改进它。我们想做这样的事情,但不知道怎么做:
- 我们要创建要解密的数据池
- 创建相同 class 的多个实例(最好每个 CPU 核心一个)作为每个核心一个线程。
- 有某种机制来为这些实例提供数据
- 当池为空时,关闭所有线程。
我们不想为池中的每个对象启动新线程,但线程数量有限运行并行处理相同的数据列表并逐一处理。
更新 1:
我们已经尝试过评论中提到的方法,尤其是存储队列和 Web 作业,但由于我们代码的结构,实施时必须进行重大更改,但结果不确定。所以这是不可能的。
最后我们做了如下,最后分享结果:
我们正在创建 "decrypt-or" 的 12 个实例 - 使用 AES 256 解密实例。数字 12 只是最高值,实际上根据负载只创建 4 - 6 个实例。当主队列耗尽时关闭实例。
所有需要解密的对象都在队列中,"decrypt-or"的每个实例都有自己的假想队列。因此,我们正在处理来自主队列的对象,并在假想队列中搜索具有 0 个对象或对象数最少的 "decrypt-or"。
结果
获取所有耗时最多的方法作为我们的参考:
- 原始实现:6.39 秒/CPU在 16 个内核上加载 100%
- 使用 "decrypt-or" 的一个实例实施:1.62 秒/CPU 在 16 个内核上负载 50 - 60%
- 12 个 "decrypt-or" 实例:1.27 秒/CPU 在 16 个内核上负载 20 - 25%
如您所见,与单实例实施相比,我们能够减少 21% 的时间,但更多的是我们减少了 CPU 使用,因此我们将尝试在不影响速度的情况下减少内核。
下一步将进行更大规模的性能测试,以了解这种方法的局限性。
答案正在更新中:
我们正在创建 "decrypt-or" 的 12 个实例 - 使用 AES 256 解密实例。数字 12 只是最高值,实际上根据负载只创建 4 - 6 个实例。当主队列耗尽时关闭实例。
所有需要解密的对象都在队列中,"decrypt-or"的每个实例都有自己的假想队列。因此,我们正在处理来自主队列的对象,并在假想队列中搜索具有 0 个对象或对象数最少的 "decrypt-or"。