异步操作性能

时间:2009-02-22 22:34:45

标签: .net asynchronous filestream

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

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

3 个答案:

答案 0 :(得分:2)

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

  

在I / O请求的情况下   预计需要大量的   时间,例如刷新或备份   大型数据库还是慢的   通信链路,异步I / O.   通常是优化的好方法   处理效率。但是,对于   相对较快的I / O操作,   处理内核I / O的开销   请求和内核信号可能会产生   异步I / O不太有益,   特别是如果有很多快速I / O.   需要进行操作。在这   情况下,同步I / O会更好。   机制和实施   如何完成这些的细节   任务因类型而异   使用的设备句柄和   应用程序的特殊需求。   换句话说,通常有   多种方法来解决问题。

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

使用异步线程不应被视为提高任何特定请求速度的方法,而是通过允许应用程序在等待I / O相对较慢的同时继续处理其他任务来提高整体效率的方法

答案 1 :(得分:1)

您确定正确地对复印操作进行了基准测试吗?任何异步操作只是创建新线程并在新线程中运行操作,同时让主线程执行其他操作。

异步操作通常比自己创建线程提供了一些简化(更少的代码行),但它们不应该影响性能,而不是创建新的线程。

答案 2 :(得分:1)

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