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

问题描述 投票:5回答:1

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

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

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

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

c# .net multithreading asynchronous
1个回答
2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.