Flush stream after benchmarkStarting in ConsoleReporter

This means that the user will see the estimation of full benchmark
running time when it is available, unlike now when it often only
ends up flushed after the benchmark is fully finished.

This means that the user will almost immediately see the start
of table like this

```
benchmark name                       samples       iterations    estimated
                                     mean          low mean      high mean
                                     std dev       low std dev   high std dev
-------------------------------------------------------------------------------
Fill vector generated                          100            54     3.0834 ms
```

This presents significant improvement in user experience especially
for long running benchmarks.
This commit is contained in:
Martin Hořeňovský 2023-08-13 23:08:12 +02:00
parent 9538d16005
commit ad56463477
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A

View File

@ -218,6 +218,7 @@ struct ColumnInfo {
}; };
struct ColumnBreak {}; struct ColumnBreak {};
struct RowBreak {}; struct RowBreak {};
struct OutputFlush {};
class Duration { class Duration {
enum class Unit { enum class Unit {
@ -334,12 +335,12 @@ public:
} }
template<typename T> template<typename T>
friend TablePrinter& operator << (TablePrinter& tp, T const& value) { friend TablePrinter& operator<< (TablePrinter& tp, T const& value) {
tp.m_oss << value; tp.m_oss << value;
return tp; return tp;
} }
friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) { friend TablePrinter& operator<< (TablePrinter& tp, ColumnBreak) {
auto colStr = tp.m_oss.str(); auto colStr = tp.m_oss.str();
const auto strSize = colStr.size(); const auto strSize = colStr.size();
tp.m_oss.str(""); tp.m_oss.str("");
@ -361,13 +362,18 @@ public:
return tp; return tp;
} }
friend TablePrinter& operator << (TablePrinter& tp, RowBreak) { friend TablePrinter& operator<< (TablePrinter& tp, RowBreak) {
if (tp.m_currentColumn > 0) { if (tp.m_currentColumn > 0) {
tp.m_os << '\n'; tp.m_os << '\n';
tp.m_currentColumn = -1; tp.m_currentColumn = -1;
} }
return tp; return tp;
} }
friend TablePrinter& operator<<(TablePrinter& tp, OutputFlush) {
tp.m_os << std::flush;
return tp;
}
}; };
ConsoleReporter::ConsoleReporter(ReporterConfig&& config): ConsoleReporter::ConsoleReporter(ReporterConfig&& config):
@ -473,8 +479,11 @@ void ConsoleReporter::benchmarkPreparing( StringRef name ) {
void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) { void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {
(*m_tablePrinter) << info.samples << ColumnBreak() (*m_tablePrinter) << info.samples << ColumnBreak()
<< info.iterations << ColumnBreak(); << info.iterations << ColumnBreak();
if (!m_config->benchmarkNoAnalysis()) if ( !m_config->benchmarkNoAnalysis() ) {
(*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak(); ( *m_tablePrinter )
<< Duration( info.estimatedDuration ) << ColumnBreak();
}
( *m_tablePrinter ) << OutputFlush{};
} }
void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) { void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {
if (m_config->benchmarkNoAnalysis()) if (m_config->benchmarkNoAnalysis())