在 c++ 中,使用 istream::seekg 操作的成本是多少?
编辑:寻找文件和读取字节我能逃脱多少?频率与偏移量的关系如何?
我有一个正在解析的大文件(4GB),我想知道是否有必要尝试合并我的一些 seekg 调用。我认为文件位置差异的大小会起作用——比如,如果你在内存中寻找超过一页,它会影响性能——但小的寻找并不重要。这个对吗?
在 c++ 中,使用 istream::seekg 操作的成本是多少?
编辑:寻找文件和读取字节我能逃脱多少?频率与偏移量的关系如何?
我有一个正在解析的大文件(4GB),我想知道是否有必要尝试合并我的一些 seekg 调用。我认为文件位置差异的大小会起作用——比如,如果你在内存中寻找超过一页,它会影响性能——但小的寻找并不重要。这个对吗?
这个问题在很大程度上取决于您的操作系统和磁盘子系统。
显然,搜索本身将花费零时间,因为它只是更新偏移量。实际上读取会从磁盘中提取一些数据......
...但是有多少数据取决于很多事情。您的磁盘有一个缓存,它可能有自己的块大小,并且可能会进行某种预读。您的 RAID 控制器(如果有)将有自己的缓存,可能有自己的块大小和预读。
你的内核有一个页面缓存——本质上是所有的空闲内存——它也可能会进行某种预读。在 Linux 上,这是可配置的,内核将根据访问模式的顺序、是否调用posix_fadvise
等来调整它。
所有这些缓存意味着如果您访问一些数据,然后再访问附近的数据,那么第二次访问可能根本不会真正触及磁盘。
如果您可以选择编码以便按顺序访问文件,那肯定会比随机读取更快,尤其是小型随机读取。在单个机械磁盘上查找大约需要 10 毫秒,因此您可以在这里进行计算。(虽然在固态驱动器上搜索要快 100 倍左右。)
大读取通常比小读取好......虽然一次处理几千字节的数据可能比大块更快,如果它允许处理保留在缓存中。
简而言之,您需要提供有关您的系统和应用程序的更多详细信息才能获得正确的答案,即使这样,最有可能的答案是“对其进行基准测试”。