如何加快字符输出?
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(如果您正在写入文件)来改进。
我想通过优化 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(如果您正在写入文件)来改进。