【发布时间】:2009-05-14 04:23:47
【问题描述】:
对于相同数量的数据和相同的内存位置,哪个操作更耗时 - 从磁盘读取或写入磁盘?
【问题讨论】:
对于相同数量的数据和相同的内存位置,哪个操作更耗时 - 从磁盘读取或写入磁盘?
【问题讨论】:
这实际上是一个相当复杂的问题,它需要了解您的 I/O 系统是如何设置的。您引用的简单示例(将固定数量的数据读取/写入磁盘上的特定位置)并不像您想象的那么现实。以下是可能影响 I/O 性能的因素的简短摘要。
磁盘速度
硬盘速度通常以转速(rpm 或每分钟转数)表示,它告诉您盘片在驱动器内旋转的速度。典型值为 5400 至 10,000rpm。 Typical transfer rates 的传输速率为 1-1.6 GBit/sec,可以维持高达 125 MB/sec 的传输速率。
请记住,latency 和 throughput 之间存在差异。如果您将非常小的数据块写入驱动器上的不同位置,则取决于驱动器的延迟(seek time、rotational delay 和访问时间)。但是,如果您一次传输大量数据,您可能更依赖于吞吐量。您的文件系统决定了文件在磁盘上的布局方式,它可能会尝试针对此类事情进行优化(见下文)。
要考虑的另一件事是,您可以(大多数企业都这样做)在RAID 配置中使用多个驱动器获得更快的传输速率。 RAID 驱动器的吞吐量取决于您选择的条带化、镜像和奇偶校验的组合。查看Wikipedia article 了解所有细节。参数太多,这里就不完整解释了。
缓存
现代操作系统在与磁盘驱动器交互时会仔细安排。在您的程序和物理磁盘之间可能存在多层缓存,因此您作为应用程序程序员所看到的性能可能更多地取决于您的操作系统如何处理数据,而不是驱动器的实际性能。
今天的大多数操作系统都使用buffer cache,以便将磁盘中的数据保存在内存中,并且操作系统可以在与磁盘通信时进行调度。应用程序的写入看起来很快,因为它们可以直接进入内存,并且操作系统可以等待刷新缓冲区,直到它无事可做。在实践中,操作系统会以相当及时的方式尝试刷新写入,因此电源故障不会杀死您的所有数据。因此,虽然有可用的缓冲区空间,但写入速度似乎很快。如果您填满了缓冲区缓存,或者如果操作系统的可用内存很少,您可能会看到 I/O 性能下降,因为操作系统必须更频繁地刷新缓冲区。
读取速度与写入速度一样,取决于数据的缓存方式。当今大多数硬盘驱动器都具有可以提高持续传输速率的硬件缓存。同样,操作系统使用缓冲区缓存来存储您访问过的文件。如果看起来可能需要,它们中的任何一个都可以使用一些预取策略来提前从驱动器中获取数据。使用缓存,初始读取可能会很慢,但如果要读取的数据已经在某处的缓存中,则后续读取(尤其是对同一事物的读取)将花费更少的时间。
文件系统
最后,还有你的filesystem 需要考虑。一个大写可能不会都去同一个地方,所以在估计需要多长时间时不能简单地考虑你的传输速率。文件在磁盘上并不总是连续的,您的文件系统必须计算它们的布局方式,这可能会极大地影响性能,具体取决于可用空间的多少以及您的磁盘fragmented 的大小。
读/写性能归结为上述所有影响以及您在驱动器上的工作负载特征(数据大小、读写频率等等)的组合。与大多数事情一样,您需要对您的应用程序、您打算在其上运行的操作系统以及您的特定磁盘配置进行试验,以实际了解其性能。
【讨论】:
简短的回答:这取决于很多。
从应用程序级别写入通常看起来更快。因为您实际上只是要求操作系统写入数据,并且操作系统可能会快速返回并在空闲时写入数据。通过读取,您必须等待操作系统将您想要的数据返回给您。
文件系统会极大地影响读取和写入的速度...通常在写入时需要做更多的内务处理,但如果您要附加到可能会更快的文件。
大多数固态磁盘的写入速度比读取速度慢得多。
【讨论】:
缓冲区会极大地影响读写时间。缓冲区可以由操作系统在 RAM 中维护,许多驱动器还包含作为磁盘控制器一部分的内部缓冲区。
请考虑操作系统可能会在 RAM 中缓存文件的某些部分,以便可以非常快速地完成对这些部分的读取。此外,操作系统可能会在 RAM 中缓存写入,直到有足够的量写入磁盘。仅将数据复制到另一个内存区域后,对“写入”函数的调用可能会返回。
简而言之,如果您需要将位写入磁盘(使用刷新操作或类似操作),那么此操作将至少与从磁盘读取未缓存的时间一样长,可能更长。
【讨论】: