我需要提高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;
}
}
答案 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;
}