0

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

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

4

3 回答 3

2

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

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

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

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

于 2009-02-22T23:09:31.727 回答
1

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

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

于 2009-02-22T22:44:46.843 回答
1

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

于 2009-02-23T10:13:38.840 回答