8

我正在帮助某人解决有关在 C 中输出的问题,但我无法回答这个看似简单的问题,我想使用答案(在我的答案中),即:

在 C/C++ 中输出到文件的最快方法是什么?

我使用 C++ 和 Java 在素数生成和数学算法优化方面做了很多工作,这有时对我来说是最大的阻碍——我有时需要快速将很多内容移动到文件中。

如果这已得到回答,请原谅我,但我一直在寻找谷歌和 SO 一段时间无济于事。

我不指望有人做基准测试工作——但有几种方法可以提交文件,我怀疑我都知道。

所以总结一下,

有哪些方法可以输出到 C 和 C++ 中的文件?

其中哪一个是/是更快的?

显然从控制台重定向是可怕的。printfcout、等的任何简短比较fputc都会有所帮助。

编辑:

从评论来看,

有一个很好的 cout 和 printf 基线测试: 混合 cout 和 printf 以获得更快的输出

这是一个很好的开始,但不是我所要求的最佳答案。例如,如果有可能,它不会处理评论中提到的 std::ostreambuf_iterator<> 。它也没有处理 fputc 或提到控制台重定向(相比之下有多糟糕)(不是它需要)

编辑2:

此外,为了论证我的历史案例,您可以假设输出的数据量几乎是无限的(程序实际上在较新的 Intel i7 上运行了几天,产生了千兆字节的文本)

临时存储在这里非常有用——我知道你不能轻易缓冲千兆字节的数据。

4

4 回答 4

3

fwrite,等函数fprintf实际上是在进行write系统调用。唯一的区别write是这些函数使用缓冲区来减少系统调用的数量。

所以,如果我需要在 和 之间进行选择,fwrite我会避免,因为它是一个很好但很复杂的函数,它可以做很多事情。如果我真的需要快速的东西,我会自己重新实现格式化部分,以达到最低要求。在和之间,我会选择是否需要写入大量小数据,否则可能会更快,因为它不需要整个缓冲系统。fprintfwritefprintffwritewritefwritewrite

于 2013-11-14T17:04:55.527 回答
2

据我所知,最大的瓶颈是一次写入一个字符(例如,使用 fputc)。这与在内存中建立缓冲区并转储整个批次(使用 fwrite)相比。经验告诉我,使用 fputc 和编写单个字符要慢得多。

这可能是因为硬件因素,而不是任何一个功能更快。

于 2013-11-14T16:47:35.087 回答
2

输出性能的瓶颈是格式化字符。

在嵌入式系统中,我通过将文本格式化为缓冲区(字符数组)来提高性能,然后使用块写入命令(例如cout.writeor )将整个缓冲区发送到输出fwrite。这些函数绕过格式化并几乎直接传递数据。

在此过程中,您可能会遇到操作系统的缓冲。

瓶颈不是由于格式化字符的过程,而是对函数的多次调用。

如果文本是常量,不要调用格式化输出函数,直接写:

static const char  Message[] = "Hello there\n";
cout.write(&Message[0], sizeof(Message) - 1);  // -1 because the '\0' doesn't need to be written
于 2013-11-14T16:54:38.977 回答
1

cout 实际上比 printf 稍微快一些,因为它是一个模板函数,所以程序集是针对使用的类型进行预编译的,尽管速度上的差异可以忽略不计。我认为您真正的瓶颈不是语言正在发出的调用,而是您的硬盘驱动器写入速率。如果您真的想一路走下去,您可以创建一个多线程或网络解决方案,将数据存储在缓冲区中,然后将数据慢慢写入与数据处理分开的硬盘驱动器.

于 2013-11-14T16:45:30.297 回答