C++ベースのstd-stringstream後cout
3403 ワード
通常、coutの前にstringstreamが採用され、直接出力ではありません.
以下の実験で,実際には直接coutの使用時間はもっと少ないが,systemのioも比較的大きいことが分かったが,なぜstringstreamを先に使用するのか.
なぜなら,我々は当時consoleに直接出力する必要はなく,先に存在し,その後ファイルに送信したり,データベースに送信したりするなど,他の出力を先にstringstream後coutする方式を採用し,アルゴリズムの統一性をより互換性があるからである.
std::stringstream ss_1;
ss_1 << "this is ";
ss_1 << "test.
";
std::cout << ss_1.str() << std::endl;
以下の実験で,実際には直接coutの使用時間はもっと少ないが,systemのioも比較的大きいことが分かったが,なぜstringstreamを先に使用するのか.
なぜなら,我々は当時consoleに直接出力する必要はなく,先に存在し,その後ファイルに送信したり,データベースに送信したりするなど,他の出力を先にstringstream後coutする方式を採用し,アルゴリズムの統一性をより互換性があるからである.
#include
#include
#include
#include
#include
int main(void)
{
std::cout << "Fill:
"
<< std::left << std::setfill(' ') << std::setw(12) << -1.23 << std::right << std::setfill(' ') << std::setw(12) << std::hex << std::showbase << 42 << '
'
<< std::left << std::setfill(' ') << std::setw(12) << -1.3 << std::right << std::setfill(' ') << std::setw(12) << std::hex << std::showbase << 142 << '
'
<< std::left << std::setfill(' ') << std::setw(12) << -1 << std::right << std::setfill(' ') << std::setw(12) << std::hex << std::showbase << 4142 << '
';
auto start = std::chrono::high_resolution_clock::now();
std::chrono::duration sum_diff_1 = start - start;
std::chrono::duration sum_diff_2 = start - start;
std::chrono::duration sum_diff_3 = start - start;
unsigned int idx = 1000;
while (idx--)
{
auto start_1 = std::chrono::high_resolution_clock::now();
std::stringstream ss_1;
for (unsigned int i = 0; i < 5; ++i) {
ss_1 << "this is test.
";
}
std::cout << ss_1.str() << std::endl;
auto end_1 = std::chrono::high_resolution_clock::now();
auto start_2 = std::chrono::high_resolution_clock::now();
std::stringstream ss_2;
for (unsigned int i = 0; i < 5; ++i) {
ss_2 << "this is test." << std::endl;
}
std::cout << ss_2.str() << std::endl;
auto end_2 = std::chrono::high_resolution_clock::now();
auto start_3 = std::chrono::high_resolution_clock::now();
for (unsigned int i = 0; i < 5; ++i) {
std::cout << "this is test." << std::endl;
}
auto end_3 = std::chrono::high_resolution_clock::now();
std::chrono::duration diff_1 = end_1 - start_1;
std::chrono::duration diff_2 = end_2 - start_2;
std::chrono::duration diff_3 = end_3 - start_3;
sum_diff_1 += diff_1;
sum_diff_2 += diff_2;
sum_diff_3 += diff_3;
}
std::cout << "ss \
" << sum_diff_1.count() << std::endl;
std::cout << "ss endl " << sum_diff_2.count() << std::endl;
std::cout << "cout " << sum_diff_3.count() << std::endl;
getchar();
return 0;
}
/*
ss
14.6097
ss endl 14.508
cout 13.9853
*/