Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 以c和c++;_C++_C_File Io_Io - Fatal编程技术网

C++ 以c和c++;

C++ 以c和c++;,c++,c,file-io,io,C++,C,File Io,Io,我正在帮助某人回答一个关于C语言输出的问题,但我无法回答这个看似简单的问题,我想用答案(在我的答案中)来回答这个问题,即: 在C/C++中,以什么方式输出文件? 我已经用C++和java做了大量的素数生成和数学算法优化,这是我最大的保留——有时我需要大量的移动到文件中。 请原谅我,如果这个问题已经得到了回答,但我已经在谷歌上搜索了一段时间,所以没有结果 我不希望有人做基准测试的工作,但有几种方法可以归档,我怀疑我是否都知道 总而言之 在C和C++中,有什么方法输出到文件? 这些中哪一个更快 显然

我正在帮助某人回答一个关于C语言输出的问题,但我无法回答这个看似简单的问题,我想用答案(在我的答案中)来回答这个问题,即:

<>在C/C++中,以什么方式输出文件?

我已经用C++和java做了大量的素数生成和数学算法优化,这是我最大的保留——有时我需要大量的移动到文件中。 请原谅我,如果这个问题已经得到了回答,但我已经在谷歌上搜索了一段时间,所以没有结果

我不希望有人做基准测试的工作,但有几种方法可以归档,我怀疑我是否都知道

总而言之

<>在C和C++中,有什么方法输出到文件?

这些中哪一个更快

显然,从控制台重定向是可怕的。 对
printf
cout
fputc
等进行任何简短的比较都会有所帮助

编辑:

从评论来看

cout和printf在以下方面有一个很好的基线测试:

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

编辑2:

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


临时存储在这里非常有用——据我所知,您无法轻松缓冲千兆字节的数据。

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

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


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

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

在嵌入式系统中,我通过将文本格式化为缓冲区(字符数组),然后使用块写入命令(如
cout.write
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

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


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

你试过C++的std::ostreambuf\u迭代器吗?我没听说过这个。谢谢我必须在几天内尝试使用我能找到的所有方法编写一些基准测试。这不会将输出“解释”为通常会将内容发送到std::cout。不过,C风格的解决方案可能更快。请尝试缓冲输出,然后从缓冲区中以大的块写入文件(使用块写入函数,如
ostream::write
fwrite()
)。无论使用何种语言,这都会提高性能。其他调整,如直接写入硬盘,可能没有那么大的影响。例如,ostream::write()或fwrite()。您调用数据数组中的每一个,并告诉它您要写入多少字节。对于随机访问,ifstream::seekg()或fseek()将跳转到您想要的任何字节位置,然后像往常一样是istream::read()或fread()?例如,用流发送几十个数字/字符串,而不是只发送一个?一般来说,写更大的数据块更好。对输出的每次调用都有开销。每次调用20次以写入1个字符的开销是调用1次以写入20个字符的开销的20倍。@Plasmarob Yes。我必须加载一个118MB的文件。我开始使用fgetc,这需要超过15分钟才能加载。我把它改成使用fread,时间缩短到5分钟左右。(我知道你说的是写,而不是读。但同样的想法也适用)我认为模板函数会因为开销而稍微慢一点。它们需要更多的时间来编译,但一旦编译完成就只是汇编。我也会打包你的数据,我的意思是