如果我用c或c ++调用pread
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
偏移量的时间复杂度是多少?我们只是跳到偏移量吗?还是程序读入“偏移”字节数?到达偏移量是O(1)还是O(offset)?
答案 0 :(得分:0)
没有一个简单的答案。
首先,I / O系统可能太复杂了,对于任何通用声明来说,要实现通用性,肯定会有太多变化。文件系统很重要,磁盘驱动器很重要,RAID配置(如果适用)很重要。这仅适用于简单的文件系统,例如XFS或ext4。对于组合的文件系统/卷管理器(例如ZFS)或复杂的多设备高性能文件系统(例如GPFS或QFS / SAMFS),事情变得非常复杂。磁带系统和分层存储管理器使事情变得更加复杂。
第二,I / O操作的实际模式非常重要。从SSD读取随机偏移不会对性能产生太大影响,而从旋转磁盘或磁带上读取随机偏移将对性能产生很大影响。缓存将如何影响性能?诸如预读之类的优化策略怎么样?
所以,如果您想要答案
偏移量的时间复杂度是多少?我们只是跳到偏移量吗?还是程序读入“偏移”字节数?到达偏移量是O(1)还是O(offset)?
您需要在预定的系统上运行I / O操作,对其进行彻底的基准测试,并查看其真正的特征。
或者,您可以彻底描述您的系统和预期的I / O模式,并且这里的某人可能会为您提供有关该负载下系统可能行为的一些估计。然后,如果您随后在该系统上对您的I / O模式进行基准测试,那么这些估计甚至可能是正确的。
答案 1 :(得分:0)
渐近符号不能应用于有限设备,因为它描述了参数趋于无穷大的趋势。偏移量是有界的,因此您的问题无关紧要。
如果您的问题更实际,则直接访问介质(磁盘,闪存盘,光盘)可以具有恒定时间访问权限,或者访问时间是到存储介质的距离(复杂但缓慢增长)的函数先前的访问权限。顺序访问介质(磁带,打孔带等)的时间可能与上次访问的距离大致成比例,除非需要倒带。
在任何情况下,都无法提供精确的分析关系。
更一般地说,由于偏移遍历了速度越来越慢的存储设备(从超快缓存到磁盘文件,再到外部文件,甚至是外部文件,离线/高延迟设备,例如磁带点唱机,然后要求操作员物理安装磁带...)。但这使我们远离pread
:-)