在c++中,使用istream::seekg操作的成本有多高?
编辑:我可以通过查找文件和读取字节来逃脱多少惩罚?频率与偏移量的关系如何?
我正在解析一个大文件(4GB),我想知道是否有必要尝试合并我的一些搜索调用。我认为文件位置差异的大小起着一定的作用——就像如果你在内存中查找超过一个页面,它将影响性能——但是小的查找不会产生任何后果。它是否正确?
这个问题在很大程度上取决于您的操作系统和磁盘子系统。
显然,查找本身花费的时间基本上为零,因为它只是更新偏移量。实际上读取会从磁盘中提取一些数据......
...但是有多少数据取决于很多因素。您的磁盘有一个缓存,它可能有自己的块大小,并且可能会进行某种预读。您的 RAID 控制器(如果有)将拥有自己的缓存,可能具有自己的块大小和预读功能。
你的内核有一个页面缓存——本质上都是空闲RAM——而且它也可能会进行某种预读。在 Linux 上,这是可配置的,内核将根据您的访问模式的顺序来调整它,无论您是否调用过posix_fadvise
, etc.
所有这些缓存意味着,如果您访问某些数据,然后稍后访问附近的数据,则第二次访问有可能根本不会真正触及磁盘。
如果您可以选择编码以便顺序访问文件,那么这肯定会比随机读取更快,尤其是小型随机读取。在单个机械磁盘上查找大约需要 10 毫秒,因此您可以在这里进行计算。 (尽管在固态硬盘上查找速度大约快 100 倍。)
大读取通常比小读取更好……尽管如果允许处理保留在缓存中,一次处理几千字节的数据可能比大块更快。
简而言之,您需要提供有关您的系统和应用程序的更多详细信息才能获得正确的答案,即使这样,最可能的答案也是“对其进行基准测试”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)