正在使用istream :: seekg太贵了

Is using istream::seekg too much expensive?

本文关键字:seekg istream      更新时间:2023-10-16

在C 中,使用istream :: seekg操作多么昂贵?

编辑:我可以远离围绕文件和阅读字节来逃脱多少?频率与偏移的幅度呢?

我有一个我正在解析的大文件(4GB),我想知道是否有必要尝试合并一些我的SeekG呼叫。我假设文件位置的差异范围扮演着角色 - 例如,如果您在内存中寻求更多的页面,它会影响性能 - 但小型寻求并没有结果。这是正确的吗?

这个问题很大程度上取决于您的操作系统和磁盘子系统。

显然,搜索本身将基本上需要零时间,因为它只是更新了偏移。实际阅读会从磁盘中删除一些数据...

...但是多少数据取决于许多事情。您的磁盘具有一个可能具有自己的块大小的缓存,并且可能会进行某种读取。您的RAID控制器(如果有)将具有自己的缓存,可能具有自己的块大小并读取。

您的内核具有页面缓存 - 本质上是免费的RAM - 它也可能会进行某种读取。在Linux上,这是可配置的,并且内核将根据您的访问模式的顺序模式,无论您是称为posix_fadvise等,等等。

所有这些缓存意味着如果您访问某些数据,则稍后访问附近的数据,第二次访问实际上根本不会触摸磁盘。

如果您可以选择编码,以便依次访问文件,则肯定会比随机读取更快,尤其是随机读数。在单个机械磁盘上寻求大约10毫秒,因此您可以在这里进行数学。(尽管寻求固态驱动器的速度约为100倍。)

大读数通常比小读数要好...尽管如果一次处理几千字节的处理数据可能会比较大的块更快,如果它允许处理保留在缓存中。

简而言之,您将需要提供有关系统和应用程序的更多详细信息,以获取适当的答案,即使如此,最有可能的答案是"基准"。