【问题标题】:How can I make cout faster?我怎样才能让 cout 更快?
【发布时间】:2011-06-14 22:21:12
【问题描述】:

有什么方法可以让这个运行更快并且仍然做同样的事情?

#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);
}

IDE:开发 C++ ||操作系统:Windows

【问题讨论】:

  • 可能更快地构建一个字符串并输出一次,或者每个外部循环输出一次,即 1 或 20 个 couts,而不是 20*80=1600
  • @Marc B:缓冲 I/O 库应该会为您处理这些问题。不幸的是,C++ iostream 在缓冲和 I/O 方面都很慢。看看我问过的问题,如果你想看到一些很好的基准来展示它们有多悲惨。
  • @Marc B:为什么不把它作为一个真正的答案呢?
  • 缓冲有助于实际 I/O 本身,但函数调用通常并非免费。 20 个输出每个 80 个字符几乎肯定会比 1600 个每个一个字符快。并不是因为它实际上将这些字符发送到 设备, 只是因为它正在构建和拆除堆栈帧等等。
  • @Drew:因为我只是在猜测。在我的生活中,我从来没有写过 C++ 程序的第一行。

标签: c++ performance console-application cout dev-c++


【解决方案1】:

正如 Marc B 在 cmets 中所说,首先将输出放入字符串中应该更快:

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;
}

【讨论】:

  • 哦,请预先分配该字符串。 std::string 不一定具有优化的分配模式,例如 std::vector
  • @Ben Voigt:如果有必要,我会非常失望......这听起来绝对是实施质量问题......
  • @Matthieu M:我怀疑任何默认的字符串实现都会保留 1600 个字节。因此,在完成写作之前可能会有多次重新分配。预先预留所需空间是个好主意。
【解决方案2】:

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

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?
  }

【讨论】:

  • 我就是这么想的。无需每次都动态分配大小相同的数组。
【解决方案3】:

当然,使用来自stdio.hputchar

【讨论】:

  • @Mark:真的吗?您确定瓶颈是您的程序而不是控制台窗口吗?你能检查一下输出重定向到文件时是否更快?
  • 这里的问题不是使用 C++ 与 C。(事实上,在他的示例中,它是来自 cstdio 的 putchar())。问题是打印每个字符的数据。
  • @Bjoern: putchar 是缓冲的,与实际在屏幕上绘制文本相比,它应该相当快。
  • C++ io 函数也会被缓冲。
  • @Ed:是的,但它们需要一个函数调用(不是内联,因为它们是虚拟的),除非你有一个非常聪明的链接器并且 LTO 被激活(即使那样,它也可能不起作用)。不知道putchar是不是inline。
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2020-04-06
  • 2017-09-07
  • 2021-11-12
  • 2014-07-05
  • 2021-07-09
  • 2020-12-27
相关资源
最近更新 更多