[英]Will reading a file be faster with a FILE* or an std::ifstream?
当我使用std :: ofstream遇到问题时,我正在考虑这个问题。
我的想法是从std :: ifstream开始,它不支持随机访问。 相反,它只是从头开始,一直流到您想要的部分。 这只是很快,所以我们没有注意到吗?
而且我很确定FILE *支持随机访问,所以这也会很快吗?
ifstream支持使用seekg进行随机访问。 FILE *可能更快,但是您应该对其进行测量。
由于它们都暗示着系统调用,并且比其他操作要耗费数个数量级的时间,因此两者的性能应该非常相似。
假设FILE *更快。 现在,您能给我一个很好的理由,为什么不应该在此方面实现std::ifstream
? 这意味着性能变得相似。
我将相反的情况(如果std::ifstream
更快)留给读者练习(提示,那里的情况也是如此)。
在担心性能之前,您应该始终牢记一条经验法则:
编写您语言的标准库的人至少有4个正常的大脑细胞。 他们不是愚蠢的。
这意味着,如果可以根据特征Y轻松实现特征X,则X不会比Y明显慢。
如果在标准输入或输出上运行速度比较,请记住之前调用std::ios_base::sync_with_stdio(false)
。 当此设置为true
,将完成所有操作,以便从std::cin
读取与fgets(stdin)
相同的缓冲区中的数据。 将其设置为false可为iostream提供更多的自由度和更少的簿记。
请记住,随机I / O将破坏底层API中完成的所有缓存。 而且,无论使用哪种机制(假定文件大小很大),直到到达特定位置都比查找要快得多。
我在这里与stribika在一起:测量然后做出决定。
std::ifstream
是FILE
的包装器,因此前者没有后者快。 它们的差异取决于编译器以及它是否可以内联包装函数调用并执行其他优化。 此外,从C ++流中读取格式化的数据的速度较慢,因为它们可以与语言环境等配合使用。
但是,如果您经常要求进行随机访问,那么这将成为瓶颈,因为其他答案也是如此。 无论如何,最好的方法是使用探查器并评估您的应用程序性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.