我是 Grand Central Dispatch 的忠实粉丝,最近我一直在看dispatch_io_*
电话系列。很容易看出这个 API 如何对网络 I/O 有用(慢,高延迟)。也就是说,dispatch_io_create_with_path
排序的存在意味着在本地文件系统上使用。(是的,我知道路径也可以指向远程网络文件系统上的资源,但无论如何......)在玩弄它时,我观察到dispatch_io_*
与使用简单阻塞相比,使用似乎会带来相当大的开销I/O 调用 ( read
,write
, ETC。)。这种减速似乎主要来自用作块的内核同步原语在队列之间来回编组。在我一直在使用的示例工作负载中(非常受 I/O 限制),减速可能高达 10 倍。一方面,它看起来dispatch_io
永远不会成为健谈(小颗粒)I/O 的胜利。
我假设在具有单个本地物理存储卷的单台机器的常见情况下,I/O 请求将在设备级别有效地序列化。从那里,我发现自己有这两个想法:
- 如果您的工作负载受 CPU 限制,那么根据定义,您已经可以比处理数据更快地读取/写入数据。
- 如果您的工作负载受 I/O 限制(在这种情况下 - 一个本地物理卷),则使用
dispatch_io
无法使您的磁盘更快地为您提供数据。
从那里开始,我认为这个 API 的最佳点可能在中间——一个在 CPU 密集型和 I/O 密集型之间摇摆不定的工作负载,但在这一点上,我有点认为自己陷入了困境,所以我想我会问 StackOverflow。
我将接受第一个描述具有这些先决条件(即单台机器、单个本地物理磁盘)的“真实世界”工作流的答案,使用这些前提条件dispatch_io
会产生显着的性能改进。