Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我怎样才能使cout更快?_C++_Performance_Console Application_Cout_Dev C++ - Fatal编程技术网

C++ 我怎样才能使cout更快?

C++ 我怎样才能使cout更快?,c++,performance,console-application,cout,dev-c++,C++,Performance,Console Application,Cout,Dev C++,有没有什么方法可以让它跑得更快,同时还能做同样的事情 #include <iostream> int box[80][20]; void drawbox() { for(int y = 0; y < 20; y++) { for(int x = 0; x < 80; x++) { std::cout << char(box[x][y]); } } } int

有没有什么方法可以让它跑得更快,同时还能做同样的事情

#include <iostream>

int box[80][20];

void drawbox()
{
    for(int y = 0; y < 20; y++)
    {
        for(int x = 0; x < 80; x++)
        {
            std::cout << char(box[x][y]);
        }
    }
}

int main(int argc, char* argv[])
{
    drawbox();
    return(0);
}
#包括
内线框[80][20];
空抽屉()
{
对于(int y=0;y<20;y++)
{
对于(int x=0;x<80;x++)
{

std::cout当然,使用
stdio.h
中的
putchar
,正如Marc B在评论中所说,首先将输出放入字符串应该更快:

int box[80][20];

void drawbox()
{
    std::string str = "";
    str.reserve(80 * 20);

    for(int y = 0; y < 20; y++)
    {
        for(int x = 0; x < 80; x++)
        {
            str += char(box[x][y]);
        }
    }

    std::cout << str << std::flush;
}
int-box[80][20];
空抽屉()
{
std::string str=“”;
自然保护区(80*20);
对于(int y=0;y<20;y++)
{
对于(int x=0;x<80;x++)
{
str+=char(框[x][y]);
}
}

std::cout显而易见的解决方案是以不同的方式声明
数组:

char box[20][81];
然后您可以一次
cout
一行。如果出于任何原因无法执行此操作,则无需在此处使用std::string--
char
数组速度更快:

char row[81] ; row[80] = 0 ;
for (int y = 0; y < 20; y++)
  {
  for (int x = 0 ; x < 80 ; x++)
    row[x] = char(box[x][y]) ;
  std::cout << row ;
  // Don't you want a newline here?
  }
char行[81];行[80]=0;
对于(int y=0;y<20;y++)
{
对于(int x=0;x<80;x++)
行[x]=字符(框[x][y]);

std::可能更快地构建一个字符串并输出一次,或者每个外部循环一次,即1或20个couts,而不是20*80=1600@MarcB:缓冲的I/O库应该为您处理。不幸的是,C++ IOFFROM在缓冲和I/O上都是狗慢的,请看我问的问题,如果您想看NIC。e基准测试显示了它们有多糟糕。@Marc B:为什么不把这作为一个真正的答案呢?缓冲有助于实际的I/O本身,但函数调用通常不是免费的。20个输出(每个80个字符)几乎肯定比1600个输出(每个一个字符)快。这不是因为它实际上发送了这些字符对一个设备来说,只是因为它正在构建和拆掉堆栈框架,除此之外。@ DRUW:因为我只是猜测。我从来没有写过这么多的C++程序在我的生活中。@真的吗?你确定是你的程序,是瓶颈而不是控制台窗口吗?你能检查当输出重定向时它是否更快?ED到文件?这里的问题不是使用C++与C.(事实上,在他的例子中,它是PSTCHARE)(从CSTDIO)这个问题是每个字符的打印数据。@ BJONL:<代码> PutChar 被缓冲,它应该比在屏幕上实际绘制文本要快得多。C++ + IO函数也被缓冲了。@ ED:是的,但是它们需要函数调用(没有内联,因为它们是虚拟的)除非你有一个非常聪明的链接器和LTO被激活。(即便如此,它也可能不起作用)。我不知道putchar是否是内联的。哦,一定要预先分配那个字符串。
std::string
不一定有优化的分配模式,比如say
std::vector
。@Ben Voigt:如果有必要的话,我会非常失望……这听起来肯定像是一个实现质量问题……@Matthieu M:我怀疑任何默认字符串实现都会保留1600字节。因此,在完成写入之前可能会有多次重新分配。最好预先保留所需的空间。这就是我的想法。无需每次动态分配相同大小的数组。