C/C++向stdout发送多个字节的最佳方法

Mil*_*lan 2 c c++ optimization stdout fwrite

分析我的程序和功能打印需要花费大量时间来执行.如何将"原始"字节输出直接发送到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);
Run Code Online (Sandbox Code Playgroud)

}

矩阵全局定义为无符号字符矩阵[3] [3];

Fre*_*ory 10

IO不是一种廉价的操作.实际上,它是一个阻塞操作,这意味着在您write编写的IO设备完成操作之前,当您调用允许更多CPU绑定进程运行时,操作系统可以抢占您的进程.

您可以使用的唯一较低级别的功能(如果您在*nix机器上进行开发)是使用原始write功能,但即便如此,您的性能也不会比现在快得多.简单地说:IO很贵.


All*_*kes 7

评价最高的答案声称IO很慢.

这里有一个快速的基准有足够大的缓冲采取OS出关键性能路径,但只有当你愿意接受巨blurps你的输出.如果第一个字节的延迟是您的问题,则需要以"dribs"模式运行.

从9字节数组中写入1000万条记录

在gcc 4.6.1下的3GHz CoreDuo上的Mint 12 AMD64

   340ms   to /dev/null 
   710ms   to 90MB output file 
 15254ms   to 90MB output file in "dribs" mode 
Run Code Online (Sandbox Code Playgroud)

FreeBSD 9 AMD64在2.4GHz CoreDuo下铿锵3.0

   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
Run Code Online (Sandbox Code Playgroud)

如果你有能力正确缓冲,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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 真的,340ms很慢. (10认同)