以 C 和 C++ 最快的速度输出到文件
Fastest output to file in c and c++
我正在帮助某人解决有关 C 输出的问题,但我无法回答这个看似简单的问题,我想使用答案(在我的答案中),即:
在C/C++中输出到文件的最快方法是什么?
我在素数生成和数学算法优化方面做了很多工作,使用 C++ 和 Java,这有时对我来说是最大的障碍 - 我有时需要快速移动到文件中。
如果这个问题已经得到回答,请原谅我,但我已经在谷歌和 SO 上寻找了一段时间,但无济于事。
我并不期望有人做基准测试的工作 - 但有几种方法可以归档,我怀疑我都了解它们。
所以总结一下,
在C 和 C++ 中输出到文件有哪些方法?
其中哪一个是/是更快的?
显然,从控制台重定向很糟糕。任何对printf
、cout
、fputc
等的简要比较都会有所帮助。
编辑:
从评论中,
在以下方面,cout 和 printf 有一个很好的基线测试:混合 cout 和 printf 以获得更快的输出
这是一个很好的开始,但不是我所问的最佳答案。例如,如果可能的话,它不处理注释中提到的 std::ostreambuf_iterator<>。它也不处理 fputc 或提及控制台重定向(相比之下有多糟糕)(不是它需要)
编辑 2:
此外,为了论证我的历史案例,您可以假设输出的数据量几乎无限(程序实际上在较新的英特尔 i7 上运行数天,产生千兆字节的文本)
临时存储在这里非常有用 - 我知道您不能轻易缓冲千兆字节的数据。
fwrite
、fprintf
等。实际上正在执行write
系统调用。与write
的唯一区别是这些函数使用缓冲区来减少系统调用的数量。
所以,如果我需要在fwrite
、fprintf
和write
之间进行选择,我会避免fprintf
,因为它是一个不错但复杂的函数,可以做很多事情。如果我真的需要快速的东西,我会自己重新实现格式化部分,达到所需的最低限度。在fwrite
和write
之间,如果我需要写入大量小数据,我会选择fwrite
,否则write
可能会更快,因为它不需要整个缓冲系统。
据我所知,最大的瓶颈是一次写一个字符(例如,使用 fputc)。这与在内存中建立缓冲区并转储整个批次(使用 fwrite)相比。经验告诉我,使用 fputc 和编写单个字符要慢得多。
这可能是因为硬件因素,而不是任何一个功能更快。
输出性能的瓶颈是格式化字符。
在嵌入式系统中,我通过将文本格式化为缓冲区(字符数组)来提高性能,然后使用块写入命令(如 cout.write
或 fwrite
)将整个缓冲区发送到输出。 这些函数绕过格式化,几乎直接传递数据。
在此过程中,您可能会遇到操作系统的缓冲。
瓶颈不是由于格式化字符的过程,而是由于对函数的多次调用。
如果文本是常量,不要调用格式化的输出函数,直接编写:
static const char Message[] = "Hello theren";
cout.write(&Message[0], sizeof(Message) - 1); // -1 because the ' ' doesn't need to be written
cout 实际上比 printf 略快,因为它是一个模板函数,因此程序集是针对使用的类型预先编译的,尽管速度的差异可以忽略不计。我认为你真正的瓶颈不是语言发出的电话,而是你的硬盘写入速度。如果你真的想一路走下去,你可以创建一个多线程或网络解决方案,将数据存储在缓冲区中,然后慢慢地将数据写入与数据处理分开的硬盘驱动器。
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么在读取文件大小时文件IO速度会发生变化
- LIBCURL:网络上传下载速度的输出不准确
- 输出速度
- 为什么将 std::endl 与 ostringstream 一起使用会影响输出速度
- 以 C 和 C++ 最快的速度输出到文件
- 使用std::ofstream写入文件的速度比使用std::cout慢,然后将输出重定向到日志文件
- 关闭同步时的输出速度