以 C 和 C++ 最快的速度输出到文件

Fastest output to file in c and c++

本文关键字:速度 输出 文件 C++      更新时间:2023-10-16

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

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

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

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

我并不期望有人做基准测试的工作 - 但有几种方法可以归档,我怀疑我都了解它们。

所以总结一下,

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

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

显然,从控制台重定向很糟糕。任何对printfcoutfputc等的简要比较都会有所帮助。

编辑:

从评论中,

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

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

编辑 2:

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

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

函数如

fwritefprintf等。实际上正在执行write系统调用。与write的唯一区别是这些函数使用缓冲区来减少系统调用的数量。

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

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

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

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

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

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

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

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

static const char  Message[] = "Hello theren";
cout.write(&Message[0], sizeof(Message) - 1);  // -1 because the '' doesn't need to be written

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