diff --git a/example/example.cpp b/example/example.cpp index ef8f23ff..092eb1af 100644 --- a/example/example.cpp +++ b/example/example.cpp @@ -13,6 +13,7 @@ void rotating_example(); void daily_example(); void async_example(); void binary_example(); +void stopwatch_example(); void trace_example(); void multi_sink_example(); void user_defined_example(); @@ -71,6 +72,7 @@ int main(int, char *[]) user_defined_example(); err_handler_example(); trace_example(); + stopwatch_example(); custom_flags_example(); // Flush all *registered* loggers using a worker thread every 3 seconds. @@ -192,6 +194,16 @@ void trace_example() SPDLOG_LOGGER_TRACE(logger, "another trace message"); } +// stopwatch example +#include "spdlog/stopwatch.h" +#include +void stopwatch_example() +{ + spdlog::stopwatch sw; + std::this_thread::sleep_for(std::chrono::milliseconds(123)); + spdlog::info("Stopwatch: {} seconds", sw); +} + // A logger with multiple sinks (stdout and file) - each with a different format and log level. void multi_sink_example() { diff --git a/include/spdlog/stopwatch.h b/include/spdlog/stopwatch.h new file mode 100644 index 00000000..770ddea1 --- /dev/null +++ b/include/spdlog/stopwatch.h @@ -0,0 +1,61 @@ +// Copyright(c) 2015-present, Gabi Melman & spdlog contributors. +// Distributed under the MIT License (http://opensource.org/licenses/MIT) + +#pragma once + +#include + +// Stopwatch support for spdlog (using std::chrono::high_resolution_clock). +// Displays elapsed seconds since construction as double. +// +// Usage: +// +// spdlog::stopwatch sw; +// ... +// spdlog::debug("Elapsed: {} seconds", sw); => "Elapsed 0.005116733 seconds" +// spdlog::info("Elapsed: {:.6} seconds", sw); => "Elapsed 0.005163 seconds" +// +// +// If other units are needed (e.g. millis instead of double), include "fmt/chrono.h" and use "duration_cast<..>(sw.elapsed())": +// +// #include +//.. +// using std::chrono::duration_cast; +// using std::chrono::milliseconds; +// spdlog::info("Elapsed {}", duration_cast(sw.elapsed())); => "Elapsed 5ms" + +namespace spdlog { +class stopwatch +{ + using clock = std::chrono::high_resolution_clock; + std::chrono::time_point start_tp_; + +public: + stopwatch() + : start_tp_{clock::now()} + {} + + std::chrono::duration elapsed() const + { + return std::chrono::duration(clock::now() - start_tp_); + } + + void reset() + { + start_tp_ = clock ::now(); + } +}; +} // namespace spdlog + +// Support for fmt formatting (e.g. "{:012.9}" or just "{}") +namespace fmt { +template<> +struct formatter : formatter +{ + template + auto format(const spdlog::stopwatch &sw, FormatContext &ctx) -> decltype(ctx.out()) + { + return formatter::format(sw.elapsed().count(), ctx); + } +}; +} // namespace fmt