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