有什么方法可以更快地打印2D阵列?

时间:2019-04-18 21:28:16

标签: c++

我需要提高2D阵列的打印速度。 有什么方法可以做到吗?

char arr[50][50] = {'#' ....};
while (true) {
  for (auto i = 0; i < 50; i++) {
    for (auto j = 0; j < 50; j++) {
      cout << arr[i][j] << " ";
    }
    cout << endl;
  }
} 

2 个答案:

答案 0 :(得分:1)

我不知道您为什么要这样做,但是(在分析之后)如果是对cout的多次调用导致性能问题,请考虑使用可以传递给{{ 1}}。

这是一个使用cout的愚蠢示例,但是没有什么可以阻止您使用流运算符定义自己的类型。

string

答案 1 :(得分:0)

尝试将sprintf与printf一起使用

通过对每行使用sprintf(),您可以有效地执行50次memcpy(),长度为50次调用,而不是2500个字符复制调用。除非编译器可以优化复制到输出流的副本,否则memcpy()的速度似乎可能会快一点

好吧,我确定我的终端存在一些缓冲问题,但是OP有责任进行实际测量。在使用以下代码的终端上,对于两个循环,我得到了以下信息:

Duration1: 39459

Duration2: 171

我以前从未使用过https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio,因此,如果我换个说法,我很乐意提出建议。这对我的人数没有任何影响。

因此,问题是提供一种替代方法来快速打印出来。 Sprintf似乎是一个可行的选择。

#include <iostream>
#include <stdio.h>
#include <chrono>
#include <cstdio>


using namespace std::chrono;

int main()
{
  char arr[50][50];

  // load the array
  for (auto i = 0; i < 50; i++) {
    for (auto j = 0; j < 50; j++) {
      arr[i][j] = '#';
    }
  }

  std::ios_base::sync_with_stdio(false);
  auto start = high_resolution_clock::now();

  // print using cout
  for (auto i = 0; i < 50; i++) {
    for (auto j = 0; j < 50; j++) {
      std::cout << arr[i][j] << " ";
    }
  }
  std::cout << std::endl;

  auto stop = high_resolution_clock::now();
  auto duration = duration_cast<microseconds>(stop - start);
  std::cout << "Duration1: " << duration.count() << std::endl;

  auto start2 = high_resolution_clock::now();

  char printbuffer[2550];
  // print using sprintf
  for (auto i = 0; i < 50; i++) {
    sprintf(&printbuffer[i*50], "%s.50\n", &arr[i][0]);
  }
  printf("%.2550s", printbuffer);
  auto stop2 = high_resolution_clock::now();
  auto duration2 = duration_cast<microseconds>(stop2 - start2);
  std::cout << "Duration2: " << duration2.count() << std::endl;

  return 0;
}