Skip to content

Commit aa049f8

Browse files
committed
Some more work
1 parent 2633020 commit aa049f8

5 files changed

Lines changed: 31 additions & 87 deletions

File tree

cli/cppcheckexecutor.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,6 @@ namespace {
260260

261261
int CppCheckExecutor::check(int argc, const char* const argv[])
262262
{
263-
Timer realTimeClock("", SHOWTIME_MODES::SHOWTIME_SUMMARY);
264263
Settings settings;
265264
CmdLineLoggerStd logger;
266265
Suppressions supprs;
@@ -272,16 +271,15 @@ int CppCheckExecutor::check(int argc, const char* const argv[])
272271
return EXIT_SUCCESS;
273272
}
274273

274+
Timer realTimeClock("Summary", settings.showtime);
275+
275276
settings.loadSummaries();
276277

277278
mFiles = parser.getFiles();
278279
mFileSettings = parser.getFileSettings();
279280

280281
const int ret = check_wrapper(settings, supprs);
281282

282-
if (settings.showtime == SHOWTIME_MODES::SHOWTIME_NONE)
283-
realTimeClock.cancelRealTimeMeasurement();
284-
285283
return ret;
286284
}
287285

lib/cppcheck.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -895,9 +895,7 @@ unsigned int CppCheck::checkInternal(const FileWithDetails& file, const std::str
895895
if (Settings::terminated())
896896
return mLogger->exitcode();
897897

898-
Timer WholeFileTimer{file.spath()};
899-
if (mSettings.showtime != SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)
900-
WholeFileTimer.cancelRealTimeMeasurement();
898+
Timer WholeFileTimer{file.spath(), mSettings.showtime};
901899

902900
if (!mSettings.quiet) {
903901
std::string fixedpath = Path::toNativeSeparators(file.spath());

lib/timer.cpp

Lines changed: 17 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace {
2929
using dataElementType = std::pair<std::string, TimerResultsData>;
3030
bool more_second_sec(const dataElementType& lhs, const dataElementType& rhs)
3131
{
32-
return lhs.second.seconds() > rhs.second.seconds();
32+
return lhs.second.getSeconds() > rhs.second.getSeconds();
3333
}
3434

3535
// TODO: remove and print through (synchronized) ErrorLogger instead
@@ -42,8 +42,6 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const
4242
{
4343
if (mode == SHOWTIME_MODES::SHOWTIME_NONE || mode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)
4444
return;
45-
46-
TimerResultsData overallData;
4745
std::vector<dataElementType> data;
4846

4947
{
@@ -61,35 +59,20 @@ void TimerResults::showResults(SHOWTIME_MODES mode) const
6159

6260
size_t ordinal = 1; // maybe it would be nice to have an ordinal in output later!
6361
for (auto iter=data.cbegin(); iter!=data.cend(); ++iter) {
64-
const double sec = iter->second.seconds();
62+
const double sec = iter->second.getSeconds().count();
6563
const double secAverage = sec / static_cast<double>(iter->second.mNumberOfResults);
66-
bool hasParent = false;
67-
{
68-
// Do not use valueFlow.. in "Overall time" because those are included in Tokenizer already
69-
if (startsWith(iter->first,"valueFlow"))
70-
hasParent = true;
71-
72-
// Do not use inner timers in "Overall time"
73-
const std::string::size_type pos = iter->first.rfind("::");
74-
if (pos != std::string::npos)
75-
hasParent = std::any_of(data.cbegin(), data.cend(), [iter,pos](const dataElementType& d) {
76-
return d.first.size() == pos && iter->first.compare(0, d.first.size(), d.first) == 0;
77-
});
78-
}
79-
if (!hasParent)
80-
overallData.mClocks += iter->second.mClocks;
8164
if ((mode != SHOWTIME_MODES::SHOWTIME_TOP5_FILE && mode != SHOWTIME_MODES::SHOWTIME_TOP5_SUMMARY) || (ordinal<=5)) {
8265
std::cout << iter->first << ": " << sec << "s (avg. " << secAverage << "s - " << iter->second.mNumberOfResults << " result(s))" << std::endl;
8366
}
8467
++ordinal;
8568
}
8669
}
8770

88-
void TimerResults::addResults(const std::string& str, std::clock_t clocks)
71+
void TimerResults::addResults(const std::string& str, Duration duration)
8972
{
9073
std::lock_guard<std::mutex> l(mResultsSync);
9174

92-
mResults[str].mClocks += clocks;
75+
mResults[str].mDuration += duration;
9376
mResults[str].mNumberOfResults++;
9477
}
9578

@@ -102,15 +85,7 @@ void TimerResults::reset()
10285
Timer::Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults)
10386
: mStr(std::move(str))
10487
, mTimerResults(timerResults)
105-
, mStart(std::clock())
10688
, mShowTimeMode(showtimeMode)
107-
, mStopped(showtimeMode == SHOWTIME_MODES::SHOWTIME_NONE || showtimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)
108-
, mStartTimePoint(Clock::now())
109-
{}
110-
111-
Timer::Timer(std::string str)
112-
: mStr(std::move(str))
113-
, mShowTimeMode(SHOWTIME_MODES::SHOWTIME_FILE_TOTAL)
11489
, mStartTimePoint(Clock::now())
11590
{}
11691

@@ -121,49 +96,35 @@ Timer::~Timer()
12196

12297
void Timer::stop()
12398
{
124-
if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && !mStopped) {
125-
const std::clock_t end = std::clock();
126-
const std::clock_t diff = end - mStart;
127-
128-
if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE) {
129-
const double sec = static_cast<double>(diff) / CLOCKS_PER_SEC;
130-
std::lock_guard<std::mutex> l(stdCoutLock);
131-
std::cout << mStr << ": " << sec << "s" << std::endl;
132-
} else if (mShowTimeMode == SHOWTIME_MODES::SHOWTIME_FILE_TOTAL && mStartTimePoint != TimePoint{}) {
99+
if ((mShowTimeMode != SHOWTIME_MODES::SHOWTIME_NONE) && mStartTimePoint != TimePoint{}) {
100+
Duration diff = std::chrono::duration_cast<Duration>(Clock::now() - mStartTimePoint);
101+
if (!mTimerResults) {
133102
std::lock_guard<std::mutex> l(stdCoutLock);
134-
std::cout << "Check time: " << mStr << ": " << getRealTimePassed() << std::endl;
103+
std::cout << (mStr == "Summary" ? "Overall time: " : "Check time: " + mStr + ": ")<< durationToString(diff) << std::endl;
135104
} else {
136-
if (mTimerResults)
137-
mTimerResults->addResults(mStr, diff);
138-
else if (mStr.empty() && mStartTimePoint != TimePoint{}) { // Get real time
139-
std::lock_guard<std::mutex> l(stdCoutLock);
140-
std::cout << "Overall time: " << getRealTimePassed() << std::endl;
141-
}
105+
mTimerResults->addResults(mStr, diff);
142106
}
143107
}
144-
145-
mStopped = true;
146108
}
147109

148-
std::string Timer::getRealTimePassed()
110+
std::string Timer::durationToString(Duration duration)
149111
{
150-
auto diff = std::chrono::duration_cast<std::chrono::microseconds>(Clock::now() - mStartTimePoint);
151-
152112
// Extract hours
153-
auto hours = std::chrono::duration_cast<std::chrono::hours>(diff);
154-
diff -= hours; // Subtract the extracted hours
113+
auto hours = std::chrono::duration_cast<std::chrono::hours>(duration);
114+
duration -= hours; // Subtract the extracted hours
155115

156116
// Extract minutes
157-
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(diff);
158-
diff -= minutes; // Subtract the extracted minutes
117+
auto minutes = std::chrono::duration_cast<std::chrono::minutes>(duration);
118+
duration -= minutes; // Subtract the extracted minutes
159119

160120
// Extract seconds
161-
auto seconds = static_cast<double>(diff.count()) / std::chrono::microseconds::period::den;
121+
std::chrono::duration<double> seconds = std::chrono::duration_cast<std::chrono::duration<double>>(duration);
162122

163123
std::string ellapsedTime;
164124
if (hours.count() > 0)
165125
ellapsedTime += std::to_string(hours.count()) + "h ";
166126
if (minutes.count() > 0)
167127
ellapsedTime += std::to_string(minutes.count()) + "m ";
168-
return (ellapsedTime + std::to_string(seconds) + "s ");
128+
std::string secondsStr{std::to_string(seconds.count())};
129+
return (ellapsedTime + secondsStr.substr(0, secondsStr.length() - 3) + "s ");
169130
}

lib/timer.h

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
#include <string>
3232
#include <utility>
3333

34+
using Clock = std::chrono::high_resolution_clock;
35+
using TimePoint = std::chrono::time_point<Clock>;
36+
using Duration = std::chrono::milliseconds;
37+
3438
enum class SHOWTIME_MODES : std::uint8_t {
3539
SHOWTIME_NONE,
3640
SHOWTIME_FILE,
@@ -44,16 +48,15 @@ class CPPCHECKLIB TimerResultsIntf {
4448
public:
4549
virtual ~TimerResultsIntf() = default;
4650

47-
virtual void addResults(const std::string& str, std::clock_t clocks) = 0;
51+
virtual void addResults(const std::string& timerName, Duration duation) = 0;
4852
};
4953

5054
struct TimerResultsData {
51-
std::clock_t mClocks{};
55+
Duration mDuration;
5256
long mNumberOfResults{};
5357

54-
double seconds() const {
55-
const double ret = static_cast<double>(static_cast<unsigned long>(mClocks)) / static_cast<double>(CLOCKS_PER_SEC);
56-
return ret;
58+
std::chrono::duration<double> getSeconds() const {
59+
return std::chrono::duration_cast<std::chrono::duration<double>>(mDuration);
5760
}
5861
};
5962

@@ -62,7 +65,7 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf {
6265
TimerResults() = default;
6366

6467
void showResults(SHOWTIME_MODES mode) const;
65-
void addResults(const std::string& str, std::clock_t clocks) override;
68+
void addResults(const std::string& str, Duration duration) override;
6669

6770
void reset();
6871

@@ -74,35 +77,24 @@ class CPPCHECKLIB TimerResults : public TimerResultsIntf {
7477
class CPPCHECKLIB Timer {
7578
public:
7679
Timer(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults = nullptr);
77-
Timer(std::string str);
7880
~Timer();
7981

8082
Timer(const Timer&) = delete;
8183
Timer& operator=(const Timer&) = delete;
8284

83-
using Clock = std::chrono::high_resolution_clock;
84-
using TimePoint = std::chrono::time_point<Clock>;
85-
8685
void stop();
8786

88-
void cancelRealTimeMeasurement() {
89-
mStartTimePoint = TimePoint{};
90-
}
87+
static std::string durationToString(Duration duration);
9188

9289
static void run(std::string str, SHOWTIME_MODES showtimeMode, TimerResultsIntf* timerResults, const std::function<void()>& f) {
9390
Timer t(std::move(str), showtimeMode, timerResults);
9491
f();
9592
}
9693

9794
private:
98-
99-
std::string getRealTimePassed();
100-
10195
const std::string mStr;
10296
TimerResultsIntf* mTimerResults{};
103-
std::clock_t mStart = std::clock();
10497
const SHOWTIME_MODES mShowTimeMode = SHOWTIME_MODES::SHOWTIME_FILE_TOTAL;
105-
bool mStopped{};
10698
TimePoint mStartTimePoint{};
10799
};
108100

test/testtimer.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,7 @@ class TestTimer : public TestFixture {
3333
}
3434

3535
void result() const {
36-
TimerResultsData t1;
37-
t1.mClocks = ~static_cast<std::clock_t>(0);
38-
ASSERT(t1.seconds() > 100.0);
39-
40-
t1.mClocks = CLOCKS_PER_SEC * 5 / 2;
41-
ASSERT(std::fabs(t1.seconds()-2.5) < 0.01);
36+
// TODO add some tests
4237
}
4338
};
4439

0 commit comments

Comments
 (0)