分析我的程序和功能打印需要花费大量时间来执行.如何将"原始"字节输出直接发送到stdout而不是使用fwrite,并使其更快(需要同时将print()中的所有9字节发送到stdout)?
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不是一种廉价的操作.实际上,它是一个阻塞操作,这意味着在您write
编写的IO设备完成操作之前,当您调用允许更多CPU绑定进程运行时,操作系统可以抢占您的进程.
您可以使用的唯一较低级别的功能(如果您在*nix机器上进行开发)是使用原始write
功能,但即便如此,您的性能也不会比现在快得多.简单地说:IO很贵.
评价最高的答案声称IO很慢.
这里有一个快速的基准有足够大的缓冲采取OS出关键性能路径,但只有当你愿意接受巨blurps你的输出.如果第一个字节的延迟是您的问题,则需要以"dribs"模式运行.
340ms to /dev/null 710ms to 90MB output file 15254ms to 90MB output file in "dribs" mode
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#include #include #include 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; } }