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