From 3ecc67784aa9ee44953c743362023015e9a09a56 Mon Sep 17 00:00:00 2001 From: Alexander Karatarakis Date: Mon, 10 Oct 2016 18:12:26 -0700 Subject: Add Stopwatch class --- toolsrc/include/Stopwatch.h | 40 +++++++++ toolsrc/src/Stopwatch.cpp | 104 ++++++++++++++++++++++++ toolsrc/vcpkgcommon/vcpkgcommon.vcxproj | 2 + toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters | 6 ++ 4 files changed, 152 insertions(+) create mode 100644 toolsrc/include/Stopwatch.h create mode 100644 toolsrc/src/Stopwatch.cpp diff --git a/toolsrc/include/Stopwatch.h b/toolsrc/include/Stopwatch.h new file mode 100644 index 000000000..2bd5c31bf --- /dev/null +++ b/toolsrc/include/Stopwatch.h @@ -0,0 +1,40 @@ +#pragma once + +#include +#include + +namespace vcpkg +{ + class Stopwatch + { + public: + static Stopwatch createUnstarted(); + + static Stopwatch createStarted(); + + bool isRunning() const; + + Stopwatch& start(); + + Stopwatch& stop(); + + Stopwatch& reset(); + + template + TimeUnit elapsed() const + { + return std::chrono::duration_cast(elapsedNanos()); + } + + std::string toString() const; + + private: + Stopwatch(); + + std::chrono::nanoseconds elapsedNanos() const; + + bool m_isRunning; + std::chrono::nanoseconds m_elapsedNanos; + std::chrono::steady_clock::time_point m_startTick; + }; +} diff --git a/toolsrc/src/Stopwatch.cpp b/toolsrc/src/Stopwatch.cpp new file mode 100644 index 000000000..035d54c2b --- /dev/null +++ b/toolsrc/src/Stopwatch.cpp @@ -0,0 +1,104 @@ +#include "Stopwatch.h" +#include "vcpkg_Checks.h" + +namespace vcpkg +{ + Stopwatch Stopwatch::createUnstarted() + { + return Stopwatch(); + } + + Stopwatch Stopwatch::createStarted() + { + return Stopwatch().start(); + } + + bool Stopwatch::isRunning() const + { + return this->m_isRunning; + } + + Stopwatch& Stopwatch::start() + { + Checks::check_exit(!this->m_isRunning, "This stopwatch is already running."); + this->m_isRunning = true; + this->m_startTick = std::chrono::high_resolution_clock::now(); + return *this; + } + + Stopwatch& Stopwatch::stop() + { + auto tick = std::chrono::high_resolution_clock::now(); + Checks::check_exit(this->m_isRunning, "This stopwatch is already stopped."); + this->m_isRunning = false; + this->m_elapsedNanos += tick - this->m_startTick; + return *this; + } + + Stopwatch& Stopwatch::reset() + { + this->m_elapsedNanos = std::chrono::nanoseconds(); + this->m_isRunning = false; + return *this; + } + + std::string Stopwatch::toString() const + { + using std::chrono::hours; + using std::chrono::minutes; + using std::chrono::seconds; + using std::chrono::milliseconds; + using std::chrono::microseconds; + using std::chrono::nanoseconds; + using std::chrono::duration_cast; + + auto nanos = elapsedNanos(); + auto nanos_as_double = static_cast(nanos.count()); + + if (duration_cast(nanos) > hours()) + { + auto t = nanos_as_double / duration_cast(hours(1)).count(); + return Strings::format("%.4g h", t); + } + + if (duration_cast(nanos) > minutes()) + { + auto t = nanos_as_double / duration_cast(minutes(1)).count(); + return Strings::format("%.4g min", t); + } + + if (duration_cast(nanos) > seconds()) + { + auto t = nanos_as_double / duration_cast(seconds(1)).count(); + return Strings::format("%.4g s", t); + } + + if (duration_cast(nanos) > milliseconds()) + { + auto t = nanos_as_double / duration_cast(milliseconds(1)).count(); + return Strings::format("%.4g ms", t); + } + + if (duration_cast(nanos) > microseconds()) + { + auto t = nanos_as_double / duration_cast(microseconds(1)).count(); + return Strings::format("%.4g micros", t); + } + + return Strings::format("%.4g ns", nanos_as_double); + } + + Stopwatch::Stopwatch() : m_isRunning(false), m_elapsedNanos(), m_startTick() + { + } + + std::chrono::nanoseconds Stopwatch::elapsedNanos() const + { + if (this->m_isRunning) + { + return std::chrono::high_resolution_clock::now() - this->m_startTick + this->m_elapsedNanos; + } + + return this->m_elapsedNanos; + } +} diff --git a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj index d5e68fde3..218a826ad 100644 --- a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj +++ b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj @@ -120,6 +120,7 @@ + @@ -128,6 +129,7 @@ + diff --git a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters index ae747d687..4d40bfbe2 100644 --- a/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters +++ b/toolsrc/vcpkgcommon/vcpkgcommon.vcxproj.filters @@ -27,6 +27,9 @@ Source Files + + Source Files + @@ -56,5 +59,8 @@ Header Files + + Header Files + \ No newline at end of file -- cgit v1.2.3