胎面偏移量的时间复杂度?
Time complexity of offset in pread?
如果我在 c 或 c++ 中调用 pread
ssize_t pread(int fd, void *buf, size_t count, off_t offset);
偏移的时间复杂度是多少?我们只是跳到偏移量吗?还是程序读取"偏移"字节数?是 O(1( 还是 O(偏移(来获得偏移量?
没有单一的、简单的答案。
首先,I/O系统可能过于复杂,而且肯定有太多的变化,任何一般陈述都无法通用。 文件系统很重要,磁盘驱动器很重要,RAID 配置(如果适用(很重要。 这仅适用于简单的文件系统,如 XFS 或 ext4。 对于组合文件系统/卷管理器(如 ZFS(或复杂的多设备高性能文件系统(如 GPFS 或 QFS/SAMFS(,事情变得非常复杂。 磁带系统和分层存储管理器使事情变得更加复杂。
其次,I/O 操作的实际模式非常重要。 从 SSD 读取随机偏移不会对性能产生太大影响,而从旋转磁盘或磁带读取随机偏移量会极大地影响性能。 任何缓存将如何影响性能? 预读等优化策略怎么样?
所以,如果你想要答案
偏移的时间复杂度是多少?我们只是跳到偏移量吗?还是程序读取"偏移"字节数?是 O(1( 还是 O(偏移(来获得偏移量?
您需要在预期的系统上运行 I/O 操作,对它们进行彻底的基准测试,并查看其实际特征。
或者,您可以彻底描述您的系统和预期的 I/O 模式,这里的某个人可能会为您提供一些关于系统在该负载下可能行为的估计。 然后,如果您在该系统上对 I/O 模式进行基准测试,这些估计甚至可能在某种程度上是正确的。
渐近符号不能应用于有限设备,因为它描述了参数走向无穷大的趋势。偏移量是有界的,因此您的问题无关紧要。
如果您的问题更实用,那么直接访问介质(磁盘,闪存盘,光盘(可以具有恒定时间访问或访问时间,该访问时间是(复杂但缓慢增长(到先前访问的距离的函数。顺序访问介质(磁带、穿孔磁带等(的时间可能与到上一次访问的距离大致成正比,除非需要倒带。
在任何情况下,精确的分析关系都不可用。
更一般地说,访问巨大的存储空间可能被认为是偏移量呈指数级增长,因为您遍历了越来越慢的存储设备层次结构(从超快缓存到磁盘文件,然后到外部甚至离线/高延迟设备,如磁带自动存储塔,然后操作员被要求物理安装磁带......但这让我们远离pread
:-(
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 具有嵌套 if-else 的循环的时间复杂度
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 如何计算函数的时间复杂度?
- 求解包含"variables"的 T(n) 时间复杂度
- 查找数字是否为 2 的幂的时间复杂度
- C++ - 最坏情况和平均情况插入时间复杂度在 std::unordered_map <int,int>?
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 关于记忆后这种递归关系的时间复杂度
- 2 个嵌套循环的时间复杂度
- 给定C++代码的时间复杂度是多少?
- 胎面偏移量的时间复杂度?