假设我有一千万件物品。我想对foreach循环中的每个项目执行一些操作,然后返回该项目。
foreach(var item in items)
{
/Lets pretend this is resource-intensive
item.someIntProp++;
}
将千万个项目分解成100k项目批次,然后在异步操作中运行每个批次会更快吗?
实际场景需要使用automapper将mongoDb bson值中的一堆对象映射到.NET对象。在此过程中没有进行数据库调用,.NET只是将bsonString转换为字符串等。
一方面,在我看来,“是的,它会更快,因为多个批次将同时处理而不是按顺序处理。”另一方面,这似乎是荒谬的,它不会优化它。
答案 0 :(得分:1)
快速回答您的问题:是的,但不要按照发布的方式进行。
这是一个很好的问题,请您自己阅读一些相关信息。 Optimal number of threads per core
如果您需要处理那么多资源密集型操作,我建议您创建一个新系统来管理它们。当你拥有这么多异步进程时,你将会进行大量的上下文切换,这会降低这种速度。
话虽这么说,如果这是一个单一的应用程序,你只需要运行它来做一些转换,不要盲目地把东西扔给异步过程。使用任务并行库。这样做可以让您管理任务,并让您根据一组输入(最大/最小任务|线程,当前正在处理的项目数等)调整性能。
这将允许您找出应用程序的最佳设置,并从那里您可以将此代码重新用于需要批处理作业的其他场景。
答案 1 :(得分:0)
使用Partitoner
,可以很容易地尝试在并行处理块之前将阵列划分到的各种块大小。这里给出一个例子:
How can I maximize the performance of element-wise operation on an big array in C#