在c++中,使用istream::seekg操作的价格是多少?

编辑:寻找文件和读取字节能省多少钱?频率与偏移量的关系如何?

我正在解析一个大文件(4GB),我想知道是否有必要尝试合并一些seekg调用。我认为文件位置差异的大小起着一定的作用-就像您在内存中寻找的页面多于其他页面一样,它将影响性能-但是小规模的搜索没有任何意义。这样对吗?

最佳答案

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

显然,寻道本身将基本上花费零时间,因为它只是更新了偏移量。实际读取会从磁盘上提取一些数据...

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

您的内核具有页面缓存-本质上是所有可用RAM-并且它也可能会进行某种预读。在Linux上,这是可配置的,并且内核将根据访问模式的显示顺序,是否调用posix_fadvise等等对它进行调整。

所有这些高速缓存意味着,如果您访问某些数据,然后再访问附近的数据,则第二次访问实际上可能根本不会碰到磁盘。

如果您可以选择编码以便顺序访问文件,那肯定比随机读取(尤其是小的随机读取)要快。在单个机械磁盘上​​进行搜索大约需要10毫秒,因此您可以在此处进行数学计算。 (尽管在固态驱动器上查找的速度快了大约100倍。)

大型读取通常比小型读取要好...尽管一次处理几千字节的数据可以使较大的块更快,但要允许处理保留在高速缓存中。

简而言之,您将需要提供有关系统和应用程序的更多详细信息,以获得正确的答案,即使如此,最有可能的答案是“对它进行基准测试”。

10-08 03:50