异步操作性能

异步操作性能

问题描述:

.NET中的asynchronous programming的功能之一是在长时间运行操作执行期间保存线程。 FileStream类可以设置为允许异步操作,允许运行(例如)复制操作而不虚拟使用任何线程。令我惊讶的是,我发现运行异步流拷贝的速度不仅更慢,而且比同步流拷贝等效地使用更多的处理能力。异步操作性能

是否有任何基准测试用于比较同步操作与异步操作执行(文件,网络等)?如果异步操作比同步操作慢一倍,那么执行异步操作而不跨越单独的线程并在服务器环境中执行同步操作真的有意义吗?

实际上,文件I/O将是实际上是异步的条件是相当具体的,即使在本机Win32级别。有关更多详细信息,请参阅this article

您确定您的拷贝操作是否正确?任何异步操作都只是创建新线程,并在新线程中运行该操作,同时让主线程执行其他操作。

异步操作在创建线程时主要给出一些简化(少量代码行),但它们不应该影响性能而不会创建新的线程。

+7

纯硬件异步操作在硬件上继续调用回调,并且它们不跨越新线程 – LicenseQ 2009-02-22 22:47:30

+0

什么是“纯异步操作”?你能提供一些链接吗? – 2009-02-22 22:49:57

+0

http://msdn.microsoft.com/en-us/library/aa365683(VS.85).aspx – LicenseQ 2009-02-22 22:52:41

从您评论中包含的文章引用@ Alex的回复。

在一个I/O请求是 预计需要的 时间大量,诸如 大型数据库的刷新或备份或慢速 通信链路,异步I/O 是的情况通常是优化处理效率的好方法。然而,对于 比较快的I/O操作, 开销处理内核的I/O 请求和内核信号可能使 异步I/O不太有利, 特别是许多快速I/O 操作需要进行。在这个 的情况下,同步I/O会更好。 机制和实现 如何完成这些 任务的细节取决于所使用的设备句柄的类型和应用程序的特定需求的 类型。 也就是说,通常有多种方式可以解决问题 。

FWIW,我认为@Alex是正确的,有另一个线程运行与您的I/O请求相关联的内核代码。不过,该线程不是由您的应用程序管理的。运行内核代码的线程本身可能会阻塞设备I/O请求,并等待实际硬件完成请求,然后再发出用户模式线程的信号,但它仍然存在。

不应该认为使用异步线程可以提高任何特定请求的速度,而是通过允许您的应用程序继续处理其他任务,同时等待相对较慢的I/O.