std :: ifstream明显比FILE慢吗?

我被告知,我的库比应该慢,大约30+次解析特定文件(文本文件,大小为326 kb)的速度太慢。 该用户建议,可能是我使用std::ifstream (大概而不是FILE )。

我宁愿不要盲目地重写,所以我想我会先在这里检查,因为我的猜测会成为其他地方的瓶颈。 我正在tellg()/seekg()阅读字符,所以我使用的唯一函数是get()peek()tellg()/seekg()

更新:

我进行了描述,并且输出了令人困惑的结果 - gprof似乎并不认为花了这么长时间。 我重写了程序,首先将整个文件读入缓冲区,然后加速了大约100倍。 我认为问题可能是花了很长时间的tellg()/seekg() ,但gprof可能由于某种原因而无法看到。 无论如何, ifstream似乎不会缓冲整个文件,即使是这个大小。


我不认为这会有所作为。 特别是如果你通过字符读取char,I / O的开销可能会完全支配其他任何东西。 为什么你一次只读一个字节? 你知道它有多低效吗?

在一个326kb的文件中,最快的解决方案很可能是一次只读取到内存中。

std :: ifstream和C等价物之间的区别基本上是一个或两个虚函数调用。 如果每秒执行几千万次,它可能会有所不同,否则,不会重新执行。 文件I / O通常非常慢,以致用于访问它的API并不重要。 更重要的是读/写模式。 许多寻求是不好的,连续的读/写很好。


它应该稍微慢一些,但就像你所说的那样,它可能不是瓶颈。 你为什么不介绍你的程序,看看是不是这种情况?


我认为这不太可能会通过从fstream切换到FILE *来解决您的问题,通常都是由C库进行缓冲。 此外操作系统可以缓存读取(linux在这方面非常好)。 鉴于你正在访问的文件的大小很可能将完全在RAM中。

像PolyThinker一样,你最好的选择就是通过一个分析器来运行你的程序,并确定问题所在。

另外,如果您的磁盘碎片太多,您可能会使用seekg / tellg,因为要在首次读取文件时必须将磁头移动到正确的位置,这可能会导致明显的延迟。

链接地址: http://www.djcxy.com/p/31521.html

上一篇: Is std::ifstream significantly slower than FILE?

下一篇: Why are std::fstreams so slow?