1) 我们如何估计磁盘 I/O 操作的运行时间?我假设我们可以添加一组简单的常量来在磁盘上而不是在内存中查找值...
在《计算机系统:程序员的视角》的第 6 章中,他们给出了一个非常实用的数学模型,说明从典型磁盘读取一些数据需要多长时间。
要引用链接的 pdf 中的最后一页:
Putting it all together, the total estimated access time is
Taccess = Tavg seek + Tavg rotation + Tavg transfer
= 9 ms + 4 ms + 0.02 ms
= 13.02 ms
This example illustrates some important points:
• The time to access the 512 bytes in a disk sector is dominated by the seek time and the rotational
latency. Accessing the first byte in the sector takes a long time, but the remaining bytes are essentially
free.
• Since the seek time and rotational latency are roughly the same, twice the seek time is a simple and
reasonable rule for estimating disk access time.
*注意,链接的 pdf 来自作者网站 == 没有盗版
当然,如果正在访问的数据是最近访问过的,那么它很有可能缓存在内存层次结构中的某个地方,在这种情况下,访问时间非常短(实际上,与磁盘访问时间相比,“接近即时”)。
2)更具体地说,访问文件中特定索引的性能有什么区别?这是一个恒定时间操作吗?还是取决于指数“下降”多远?
如果寻找的位置没有在附近按顺序存储,则可能会发生另一个寻找+旋转的时间量。这取决于您要查找的文件中的哪个位置,以及该数据物理存储在磁盘上的哪个位置。例如,碎片文件保证会导致磁盘寻道读取整个文件。
需要记住的是,即使您可能只请求读取几个字节,物理读取也往往以固定大小的块(扇区大小)的倍数发生,最终进入缓存。因此,您稍后可能会搜索文件中的某个附近位置,并幸运地发现它已经在缓存中。
顺便说一句-如果您对该主题感兴趣,那本书中有关内存层次结构的整章都是纯金的。