From 4f6b56c3af935e0eb28d7f6a863d41c113092e04 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 10 Sep 2016 17:20:11 -0700 Subject: [PATCH] ircd::util: Add std::chrono timer for benching. --- include/ircd/stdinc.h | 1 + include/ircd/util_timer.h | 80 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 include/ircd/util_timer.h diff --git a/include/ircd/stdinc.h b/include/ircd/stdinc.h index 349914140..25d85b2e8 100644 --- a/include/ircd/stdinc.h +++ b/include/ircd/stdinc.h @@ -81,6 +81,7 @@ namespace ircd } #include "util.h" +#include "util_timer.h" #include "defaults.h" #include "exception.h" #include "numeric.h" diff --git a/include/ircd/util_timer.h b/include/ircd/util_timer.h new file mode 100644 index 000000000..2ac8f5ccc --- /dev/null +++ b/include/ircd/util_timer.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2016 Charybdis Development Team + * Copyright (C) 2016 Jason Volk + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ + +#pragma once +#define HAVE_IRCD_UTIL_TIMER_H + +#ifdef __cplusplus + +namespace ircd { +inline namespace util { + +struct timer +{ + using clock = std::chrono::steady_clock; + + clock::time_point start; + clock::time_point stop; + + template duration get() const; + template duration mark(); + + timer(const std::function &); + timer(); +}; + +inline +timer::timer() +:start{clock::now()} +,stop{clock::time_point::min()} +{ +} + +inline +timer::timer(const std::function &func) +:timer{} +{ + func(); + mark(); +} + +template +duration +timer::mark() +{ + stop = clock::now(); + return std::chrono::duration_cast(stop - start); +} + +template +duration +timer::get() +const +{ + static const auto min(clock::time_point::min()); + const clock::time_point stop(this->stop != min? this->stop : clock::now()); + return std::chrono::duration_cast(stop - start); +} + +} // namespace util +} // namespace ircd +#endif // __cplusplus