/* Copyright (c) 2013 Microsoft Corporation. All rights reserved. Released under Apache 2.0 license as described in the file LICENSE. Author: Leonardo de Moura */ #pragma once #include #include #include #include namespace lean { using second_duration = std::chrono::duration; struct display_profiling_time { second_duration m_time; }; std::ostream & operator<<(std::ostream & out, display_profiling_time const & time); /** \brief Low tech timer. */ class timeit { second_duration m_threshold; std::chrono::steady_clock::time_point m_start; std::ostream & m_out; std::string m_msg; public: timeit(std::ostream & out, char const * msg, second_duration threshold): m_threshold(threshold), m_out(out), m_msg(msg) { m_start = std::chrono::steady_clock::now(); } timeit(std::ostream & out, char const * msg, double threshold): timeit(out, msg, second_duration(threshold)) {} timeit(std::ostream & out, char const * msg) : timeit(out, msg, second_duration(0)) {} ~timeit() { auto end = std::chrono::steady_clock::now(); auto diff = second_duration(end - m_start); if (diff >= m_threshold) { m_out << m_msg << " " << display_profiling_time{diff} << "\n"; } } }; /** \brief Low tech timer. */ class xtimeit { second_duration m_threshold; second_duration m_excluded {0}; std::chrono::steady_clock::time_point m_start; std::function m_fn; // NOLINT public: xtimeit(second_duration threshold, std::function const & fn): // NOLINT m_threshold(threshold), m_fn(fn) { m_start = std::chrono::steady_clock::now(); } xtimeit(std::function const & fn) : xtimeit(second_duration(0), fn) {} // NOLINT xtimeit(xtimeit const &) = delete; xtimeit(xtimeit &&) = default; ~xtimeit() { auto diff = get_elapsed(); if (diff >= m_threshold && m_fn) { m_fn(diff); } } second_duration get_elapsed_inclusive() const { auto end = std::chrono::steady_clock::now(); return second_duration(end - m_start); } second_duration get_elapsed() const { return get_elapsed_inclusive() - m_excluded; } void exclude_duration(second_duration d) { m_excluded += d; } }; }