当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C/C++向stdout发送多个字节的最佳方法》经验,为你挑选了2个好方法。

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



1> FreeMemory..:

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

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



2> Allan Stokes..:

评价最高的答案声称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 

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

如果你有能力正确缓冲,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; }
}


真的,340ms很慢.
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有