使用istream::seekg是否太贵? 在C++中,使用ISTRAM有多贵::SKG操作?< /P>

使用istream::seekg是否太贵? 在C++中,使用ISTRAM有多贵::SKG操作?< /P>,c++,large-files,ifstream,seek,seekg,C++,Large Files,Ifstream,Seek,Seekg,编辑:我可以通过查找文件和读取字节获得多少好处?频率和偏移量的关系如何 我正在解析一个大文件(4GB),我想知道是否有必要尝试合并我的一些seekg调用。我认为文件位置差异的大小起到了一定的作用——比如,如果在内存中查找多个页面,就会影响性能——但小的查找并没有什么意义。这是否正确?此问题严重依赖于您的操作系统和磁盘子系统 显然,寻道本身将花费几乎为零的时间,因为它只更新一个偏移量。实际上,读取将从磁盘中提取一些数据 …但数据的多少取决于许多因素。您的磁盘有一个缓存,它可能有自己的块大小,并可能

编辑:我可以通过查找文件和读取字节获得多少好处?频率和偏移量的关系如何


我正在解析一个大文件(4GB),我想知道是否有必要尝试合并我的一些seekg调用。我认为文件位置差异的大小起到了一定的作用——比如,如果在内存中查找多个页面,就会影响性能——但小的查找并没有什么意义。这是否正确?

此问题严重依赖于您的操作系统和磁盘子系统

显然,寻道本身将花费几乎为零的时间,因为它只更新一个偏移量。实际上,读取将从磁盘中提取一些数据

…但数据的多少取决于许多因素。您的磁盘有一个缓存,它可能有自己的块大小,并可能进行某种预读。您的RAID控制器(如果有)将有自己的缓存,可能有自己的块大小和预读

你的内核有一个页面缓存——基本上都是免费的RAM——而且它也可能会进行某种预读。在Linux上,这是可配置的,内核将根据访问模式的顺序来调整它,无论您是否调用了
posix\u fadvise
,等等

所有这些缓存意味着,如果您访问一些数据,然后稍后再访问附近的数据,则第二次访问可能根本不会触及磁盘

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

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


简而言之,您需要提供更多关于系统和应用程序的详细信息才能得到正确的答案,甚至最有可能的答案是“基准测试”。位置只是一个指针,更改它实际上不会读取文件内容。啊,废话。好吧,让我把我的问题说得更合理……等等……不,我问这个问题有很好的理由……等等,别担心,不,我没有……@jweyrich:是的,你如何访问它很重要。但是从
读取
中额外复制一个页面的成本通常是无关紧要的,特别是如果您可以在缓存中对该副本进行操作的话。
mmap
所需的页面表和TLB抖动通常最终占据主导地位。(我确实有一种预感,在最近的带有“透明hugepages”的内核上,这可能会有所不同,但我从未回去尝试过……)底线是,基准测试是无法替代的。