如何加快字符输出?

How to speed up character output?

我想通过优化 I/O:

让这个 for 循环 运行 更快
for ( int row = 0; row < Y_AxisLen; ++row )
{
    for ( int col = 0; col < X_AxisLen; ++col )
    {
        std::cout << characterMatrix[ row ][ col ];
    }
}

std::vector< std::vector<char> > characterMatrix;是一个矩阵,我需要打印出来。一次打印一个 char 对性能有影响吗?另外,我应该使用 {fmt} 库而不是 std::cout 吗?

这样做会更快吗?

std::array<char, X_AxisLen> rowStr { };

for ( int row = 0; row < Y_AxisLen; ++row )
{
    for ( int col = 0; col < X_AxisLen; ++col )
    {
        rowStr[ col ] = characterMatrix[ row ][ col ];
    }

    std::cout << rowStr.data( );
    // fmt::print( "{}", rowStr.data( ) ); // Or using this one. But will this even work?
}

您可以一次写入整行并使用 fmt::print 以获得更好的性能:

#include <fmt/core.h>

#include <vector>

int main() {
  auto X_AxisLen = 10000u;
  auto Y_AxisLen = 10000u;
  auto characterMatrix =
      std::vector<std::vector<char>>(X_AxisLen, std::vector<char>(Y_AxisLen));
  for (int i = 0; i < Y_AxisLen; ++i) {
    const auto& row = characterMatrix[i];
    fmt::print("{}", std::string_view(row.data(), row.size()));
  }
}
% c++ test.cc -O3 -DNDEBUG -std=c++17 -I include src/format.cc -o test-fmt
% time ./test-fmt > /dev/null
./test-fmt > /dev/null  0.03s user 0.04s system 52% cpu 0.135 total

相比之下,这比使用 cout 和逐字符写入快约 30 倍(不是百分比):

#include <iostream>
#include <vector>

int main() {
  auto X_AxisLen = 10000u;
  auto Y_AxisLen = 10000u;
  auto characterMatrix =
      std::vector<std::vector<char>>(X_AxisLen, std::vector<char>(Y_AxisLen));
  for (int row = 0; row < Y_AxisLen; ++row) {
    for (int col = 0; col < X_AxisLen; ++col) {
      std::cout << characterMatrix[row][col];
    }
  }
}
% c++ test.cc -O3 -DNDEBUG -std=c++17 -I include src/format.cc -o test-cout
% time ./test-cout > /dev/null
./test-cout > /dev/null  4.30s user 0.08s system 95% cpu 4.581 total

这个例子有点人为,在现实世界中,差异可能不会那么显着,特别是如果您关闭与 stdio 的同步。但是,{fmt} 结果也可以通过使用格式字符串编译和 the unsynchronized API(如果您正在写入文件)来改进。