Async / Await vs Parellel.For,在这种情况下哪个更好?

时间:2017-12-19 02:52:56

标签: c# .net multithreading asynchronous

所以我有1000件物品来检查它们是否是最新的。这些项目中的每一项都需要读取数千个文件(其中一些文件可能是不同项目中的相同文件)。

目前,这是使用TPL(async / await)的实现,一个用于每个必须读取的文件,一个用于它必须检查的每个项目。这工作正常,除了我描述它时,关于第3个最昂贵的函数是线程池中的TrySteal。

使用visual studio并发查看器,我看到99%的线程花费在并发相关项目上,而执行时只有1%。正是这一点让我觉得我或许只是创造了太多的任务(注意:我不会在任何地方使用Task.Run,​​只是等待)。

Parellel.For是否比使用async / await读取一堆文件要少得多?使用任务编程库需要多少开销?

1 个答案:

答案 0 :(得分:2)

如果您正在检查硬盘驱动器上的文件,我认为此任务不是很平行。如果你试图同时读取数千个文件,你只需要使进程慢得多,因为它无法同时读取其中的许多文件,更糟糕的是,它无法在内存中缓存太多。 没有优化检查过程本身的最快选项应该是连续运行它。 如果你真的想要优化它,我建议循环遍历文件,检查每个项目,而不是循环遍历项目,检查每个文件。在这种情况下,即使在多个线程中执行它也可能是有效的(虽然不是一次完成)。

更新: 对于有足够内存来缓存所有文件的情况,它不会限制多线程。不过,我建议将并行线程的数量限制为数量,与您要使用的处理器核心数量相当。使用Parallel.ForEach()更好。此外,Parallel.Foreach()明确指出,循环是异步的,因此代码将更容易理解。