发送字节数到stdout的C / C ++最好的方法
-
22-08-2019 - |
题
仿形我的程序和功能打印被服用大量的时间来执行。我怎么可以发送“原始”字节直接输出到stdout,而不是使用的fwrite,并使其更快(需要发送的所有9bytes在打印()在同一时间到标准输出)?
void print(){
unsigned char temp[9];
temp[0] = matrix[0][0];
temp[1] = matrix[0][1];
temp[2] = matrix[0][2];
temp[3] = matrix[1][0];
temp[4] = matrix[1][1];
temp[5] = matrix[1][2];
temp[6] = matrix[2][0];
temp[7] = matrix[2][1];
temp[8] = matrix[2][2];
fwrite(temp,1,9,stdout);
}
矩阵全局定义为一个无符号的字符矩阵[3] [3];
解决方案
IO不是便宜的操作。这是,事实上,一个阻止运行,这意味着OS能够抢占你的过程,当你调用write
让更多的CPU密集型进程运行,你写来完成的IO设备之前操作。
您可以使用(如果你在* nix机器上开发)唯一的低级别的功能,是使用原始write
功能,但即使如此,你的表现会不会是速度远远超过现在。简单地说:IO是昂贵的。
其他提示
在最高评价答案声称IO是缓慢的。
下面是一个简单的指标有足够大的缓冲采取OS出关键性能路径,但仅你愿意接受巨blurps你的输出。如果延迟到第一个字节是你的问题,你需要在“点点”模式下运行。
收件从九个字节阵列10万条记录
下的gcc 4.6.1上3GHz的酷睿薄荷12 AMD64
340ms to /dev/null
710ms to 90MB output file
15254ms to 90MB output file in "dribs" mode
下铛3.0 2.4GHz的酷睿的FreeBSD 9 AMD64
450ms to /dev/null
550ms to 90MB output file on ZFS triple mirror
1150ms to 90MB output file on FFS system drive
22154ms to 90MB output file in "dribs" mode
有什么慢约IO,如果你能负担得起适当缓冲。
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
int main (int argc, char* argv[])
{
int dribs = argc > 1 && 0==strcmp (argv[1], "dribs");
int err;
int i;
enum { BigBuf = 4*1024*1024 };
char* outbuf = malloc (BigBuf);
assert (outbuf != NULL);
err = setvbuf (stdout, outbuf, _IOFBF, BigBuf); // full line buffering
assert (err == 0);
enum { ArraySize = 9 };
char temp[ArraySize];
enum { Count = 10*1000*1000 };
for (i = 0; i < Count; ++i) {
fwrite (temp, 1, ArraySize, stdout);
if (dribs) fflush (stdout);
}
fflush (stdout); // seems to be needed after setting own buffer
fclose (stdout);
if (outbuf) { free (outbuf); outbuf = NULL; }
}
可以执行输出的最原始的形式是可能的write
系统调用,这样
write (1, matrix, 9);
1是用于文件描述符标准输出(0是标准,2是标准误差)。您的标准输出将只写的速度是一个在另一端阅读它(即,终端,或者您pipeing到程序),这可能是相当缓慢的。
我不是100%肯定,但你可以尝试在FD 1(使用fcntl
)设置非阻塞IO和希望操作系统将缓冲区为您,直到它可以通过另一端被消耗。它已经有一段时间,但我认为它是这样工作的。
fcntl (1, F_SETFL, O_NONBLOCK);
YMMV虽然。请纠正我,如果我错了,在语法,正如我所说,它已经有一段时间。
也许你的问题不是fwrite()将是缓慢的,但它是缓冲。 尝试和fwrite后调用fflush(stdout中)()。
这一切真的取决于在这方面您的缓慢定义。
所有印刷是相当缓慢的,虽然输入输出流是用于印刷很慢。
您最好的选择将是用printf,沿着线的东西:
printf("%c%c%c%c%c%c%c%c%c\n", matrix[0][0], matrix[0][1], matrix[0][2], matrix[1][0],
matrix[1][1], matrix[1][2], matrix[2][0], matrix[2][1], matrix[2][2]);
可以简单地:
std::cout << temp;
的printf 更C-风格。
然而,IO操作是昂贵的,所以明智地使用它们。
正如大家所指出的IO在紧内环是昂贵的。需要调试它,当我已经正常地结束了做基于一些标准矩阵条件COUT。
如果您的应用程序是那么的控制台应用程序尝试重定向到一个文件,这将是很多比做控制台刷新速度更快。 e.g APP.EXE> matrixDump.txt
这有什么错:
fwrite(matrix,1,9,stdout);
两者之一和二维阵列占用相同的存储器。
尝试运行的程序两次。一旦与输出,一次不带。你会发现,总体而言,如果没有IO的一个是最快的。此外,您可以用叉子叉过程(或创建一个线程),一个写入一个文件(stdout)和一个做业务。