仿形我的程序和功能打印被服用大量的时间来执行。我怎么可以发送“原始”字节直接输出到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)和一个做业务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top