【发布时间】:2017-12-19 02:52:55
【问题描述】:
所以我有 1000 多个项目来检查它们是否是最新的。这些项目中的每一项都需要读取数千个文件(其中一些可能是跨不同项目的相同文件)。
目前这是使用 TPL (async/await) 实现的,一个用于它必须读取的每个文件,一个用于它必须检查的每个项目。这很好用,除了当我分析它时,第三个最昂贵的函数是线程池中的 TrySteal。
使用 Visual Studio 并发查看器,我看到 99% 的线程时间花在并发相关的项目上,而只有 1% 的时间花在执行上。正是这一点让我认为我可能只是创建了太多任务(注意:我不在任何地方使用 Task.Run,只是等待)。
与使用 async/await 读取一堆文件相比,Parellel.For 的开销会更少吗?使用任务编程库预计会有多少开销?
【问题讨论】:
-
您是否检查过资源监视器(可通过 Windows 任务管理器的“性能”选项卡获得)以查看您是否达到了磁盘子系统的性能能力?如果是这样,您可能需要重新考虑问题。缓存数据、使用多个驱动器、使用适当的 RAID 集、SSD、...。
-
可能两者都不是。相反,您可能需要考虑 TPL DataFlow,因为您可以以适合 I/O 操作次数的方式限制每个块中的消息
-
我有四个硬件突袭 SSD,因为 90% 的文件已经在内存中,所以磁盘几乎没有滴答作响。但是,所有程序同时运行时,cpu 使用率为 100%,因此我试图通过减少 cpu 使用来进行优化。看来任务调度程序是其中的重要组成部分。
标签: c# .net multithreading asynchronous