正在使用istream :: seekg太贵了
Is using istream::seekg too much expensive?
在C 中,使用istream :: seekg操作多么昂贵?
编辑:我可以远离围绕文件和阅读字节来逃脱多少?频率与偏移的幅度呢?
我有一个我正在解析的大文件(4GB),我想知道是否有必要尝试合并一些我的SeekG呼叫。我假设文件位置的差异范围扮演着角色 - 例如,如果您在内存中寻求更多的页面,它会影响性能 - 但小型寻求并没有结果。这是正确的吗?
这个问题很大程度上取决于您的操作系统和磁盘子系统。
显然,搜索本身将基本上需要零时间,因为它只是更新了偏移。实际阅读会从磁盘中删除一些数据...
...但是多少数据取决于许多事情。您的磁盘具有一个可能具有自己的块大小的缓存,并且可能会进行某种读取。您的RAID控制器(如果有)将具有自己的缓存,可能具有自己的块大小并读取。
您的内核具有页面缓存 - 本质上是免费的RAM - 它也可能会进行某种读取。在Linux上,这是可配置的,并且内核将根据您的访问模式的顺序模式,无论您是称为posix_fadvise
等,等等。
所有这些缓存意味着如果您访问某些数据,则稍后访问附近的数据,第二次访问实际上根本不会触摸磁盘。
如果您可以选择编码,以便依次访问文件,则肯定会比随机读取更快,尤其是随机读数。在单个机械磁盘上寻求大约10毫秒,因此您可以在这里进行数学。(尽管寻求固态驱动器的速度约为100倍。)
大读数通常比小读数要好...尽管如果一次处理几千字节的处理数据可能会比较大的块更快,如果它允许处理保留在缓存中。
简而言之,您将需要提供有关系统和应用程序的更多详细信息,以获取适当的答案,即使如此,最有可能的答案是"基准"。
相关文章:
- 为什么istream不支持右值提取
- 将无符号char*转换为std::istream*C++
- 需要从 istream 和 ostream 派生 iostream
- 使用std::istream::peek()总是安全的吗
- 使用 istream 参数读取的 istream 函数
- 使用 seekg() 读取C++中的文件时出现问题
- istream std::cin如何修改自定义istream缓冲区
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- C++,如何根据运行时条件构造引用不同 istream 对象的对象?
- 如何将QByteArray转换为std::istream或std::ifstream?
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- 从函数返回 istream 的正确方法
- 阅读从 istream 到矢量的不同类型列表
- 检查 istream::read 和 istream::seekg 失败的最佳方法
- 正在使用istream :: seekg太贵了
- Istream seekg()偏移量和ios::end
- Seekg 在将 iStream 与自定义 Streambuf 一起使用时不起作用
- istream::seekg与ios_base::end是否可靠?