Skip to content

Commit 1d171ae

Browse files
committed
fixed #14618 - added more metrics to timer summary / small TimerResultsData refactoring [skip ci]
1 parent 223ae46 commit 1d171ae

4 files changed

Lines changed: 23 additions & 15 deletions

File tree

lib/timer.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,24 +57,26 @@ void TimerResults::showResults(ShowTime mode, bool metrics) const
5757

5858
size_t ordinal = 1; // maybe it would be nice to have an ordinal in output later!
5959
for (auto iter=data.cbegin(); iter!=data.cend(); ++iter) {
60-
const double sec = iter->second.getSeconds().count();
61-
const double secAverage = sec / static_cast<double>(iter->second.mNumberOfResults);
6260
if ((mode != ShowTime::TOP5_FILE && mode != ShowTime::TOP5_SUMMARY) || (ordinal<=5)) {
61+
const double sec = iter->second.getSeconds().count();
6362
std::cout << iter->first << ": " << sec << "s";
64-
if (metrics)
65-
std::cout << " (avg. " << secAverage << "s - " << iter->second.mNumberOfResults << " result(s))";
63+
if (metrics) {
64+
const double secAverage = sec / static_cast<double>(iter->second.mResults.size());
65+
const double secMin = asSeconds(*std::min_element(iter->second.mResults.cbegin(), iter->second.mResults.cend())).count();
66+
const double secMax = asSeconds(*std::max_element(iter->second.mResults.cbegin(), iter->second.mResults.cend())).count();
67+
std::cout << " (avg. " << secAverage << "s / min " << secMin << "s / max " << secMax << "s - " << iter->second.mResults.size() << " result(s))";
68+
}
6669
std::cout << std::endl;
6770
}
6871
++ordinal;
6972
}
7073
}
7174

72-
void TimerResults::addResults(const std::string& str, std::chrono::milliseconds duration)
75+
void TimerResults::addResults(const std::string& name, std::chrono::milliseconds duration)
7376
{
7477
std::lock_guard<std::mutex> l(mResultsSync);
7578

76-
mResults[str].mDuration += duration;
77-
mResults[str].mNumberOfResults++;
79+
mResults[name].mResults.push_back(duration);
7880
}
7981

8082
void TimerResults::reset()

lib/timer.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
#include <map>
2828
#include <memory>
2929
#include <mutex>
30+
#include <numeric>
3031
#include <string>
3132
#include <utility>
33+
#include <vector>
3234

3335
enum class ShowTime : std::uint8_t {
3436
NONE,
@@ -43,15 +45,20 @@ class CPPCHECKLIB TimerResultsIntf {
4345
public:
4446
virtual ~TimerResultsIntf() = default;
4547

46-
virtual void addResults(const std::string& timerName, std::chrono::milliseconds duation) = 0;
48+
virtual void addResults(const std::string& name, std::chrono::milliseconds duration) = 0;
49+
50+
static std::chrono::duration<double> asSeconds(std::chrono::milliseconds ms) {
51+
return std::chrono::duration_cast<std::chrono::duration<double>>(ms);
52+
}
4753
};
4854

4955
struct TimerResultsData {
50-
std::chrono::milliseconds mDuration;
51-
long mNumberOfResults{};
56+
std::vector<std::chrono::milliseconds> mResults;
5257

5358
std::chrono::duration<double> getSeconds() const {
54-
return std::chrono::duration_cast<std::chrono::duration<double>>(mDuration);
59+
return std::accumulate(mResults.cbegin(), mResults.cend(), std::chrono::duration<double>{}, [](std::chrono::duration<double> secs, std::chrono::milliseconds duration) {
60+
return secs + TimerResultsIntf::asSeconds(duration);
61+
});
5562
}
5663
};
5764

@@ -60,7 +67,7 @@ class CPPCHECKLIB WARN_UNUSED TimerResults : public TimerResultsIntf {
6067
TimerResults() = default;
6168

6269
void showResults(ShowTime mode, bool metrics = true) const;
63-
void addResults(const std::string& str, std::chrono::milliseconds duration) override;
70+
void addResults(const std::string& name, std::chrono::milliseconds duration) override;
6471

6572
void reset();
6673

test/options.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,8 @@ options::~options()
6060
{
6161
// TODO: allow more than 5 results to be shown
6262
// TODO: provide higher resolution in output
63-
// TODO: disable the metrics
6463
if (mTimerResults)
65-
mTimerResults->showResults(ShowTime::TOP5_FILE);
64+
mTimerResults->showResults(ShowTime::TOP5_FILE, false);
6665
}
6766

6867
bool options::quiet() const

test/testtimer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class TestTimer : public TestFixture {
3333

3434
void result() const {
3535
TimerResultsData t1;
36-
t1.mDuration = std::chrono::milliseconds{1234};
36+
t1.mResults.emplace_back(1234);
3737
ASSERT(t1.getSeconds().count() > 1.233 && t1.getSeconds().count() < 1.235);
3838

3939
// TODO : more tests

0 commit comments

Comments
 (0)