使用FILE *或std :: ifstream读取文件会更快吗?

时间:2009-07-05 21:15:16

标签: c++ performance

当我使用std :: ofstream遇到问题时,我正在考虑这个问题。

我的想法是,由于std :: ifstream,它不支持随机访问。相反,它只是从头开始并流式传输,直到你到达你想要的部分。这是否很快,所以我们没有注意到?

而且我很确定FILE *支持随机访问,所以这也会很快?

6 个答案:

答案 0 :(得分:6)

ifstream支持使用seekg进行随机访问。文件*可能会更快但你应该测量它。

答案 1 :(得分:5)

由于它们都意味着系统调用,并且在操作的其余部分上将花费一些数量级的时间,因此两者的性能应该非常相似。

答案 2 :(得分:4)

我们假设FILE *更快。现在你可以给我一个一个的理由,为什么std::ifstream不应该被实现呢?这意味着性能变得相似。

我会留下相反的情况(如果std::ifstream更快)作为练习给读者(提示,那里也是如此)。

在担心表现之前,您应该始终牢记一条经验法则:

  

写你的语言的人   标准库至少有4个   工作的脑细胞。他们不是   笨

这意味着如果根据特征Y可以简单地实现特征X,那么X将不会明显慢于Y.

答案 3 :(得分:4)

如果您对标准输入或输出进行速度比较,请记得先调用std::ios_base::sync_with_stdio(false)。当此设置为true时,则完成所有操作,以便从std::cin读取来自与fgets(stdin)相同的缓冲区中的数据。将其设置为false可以使iostream更自由,更少记账。

答案 4 :(得分:0)

请记住,随机I / O将破坏底层API中的任何缓存。无论您使用哪种机制(假设您的文件大小合适),在您到达特定位置而不是寻找之前,阅读速度都不会更快。(

我在这里与stribika:措施然后做出决定。

答案 5 :(得分:0)

std::ifstreamFILE的包装器,因此前者不会比后者快。它们的不同取决于编译器以及它是否可以内联包装函数调用并执行其他优化。此外,从C ++流中读取格式化数据的速度较慢,因为它们与区域设置和其他东西一起使用。

但是,如果你经常要求随机访问,这将成为瓶颈,正如其他答案所述。无论如何,最好的方法是使用分析器并测量您的应用程序性能。