LIBINT 2.9.0
timer.h
1/*
2 * Copyright (C) 2004-2024 Edward F. Valeev
3 *
4 * This file is part of Libint library.
5 *
6 * Libint library is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * Libint library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with Libint library. If not, see <http://www.gnu.org/licenses/>.
18 *
19 */
20
21#ifndef _libint2_src_lib_libint_timer_h_
22#define _libint2_src_lib_libint_timer_h_
23
24#ifdef __cplusplus
25
26#include <libint2/util/cxxstd.h>
27
28#if LIBINT2_CPLUSPLUS_STD >= 2011
29
30#include <chrono>
31
32namespace libint2 {
33
38template <size_t N>
39class Timers {
40 public:
41 typedef std::chrono::duration<double> dur_t;
42 typedef std::chrono::high_resolution_clock clock_t;
43 typedef std::chrono::time_point<clock_t> time_point_t;
44
45 Timers() {
46 clear();
48 }
49
51 static time_point_t now() { return clock_t::now(); }
52
58 void set_now_overhead(size_t ns) { overhead_ = std::chrono::nanoseconds(ns); }
59
61 void start(size_t t) { tstart_[t] = now(); }
65 dur_t stop(size_t t) {
66 const auto tstop = now();
67 const dur_t result = (tstop - tstart_[t]) - overhead_;
68 timers_[t] += result;
69 return result;
70 }
72 double read(size_t t) const { return timers_[t].count(); }
74 void clear() {
75 for (auto t = 0; t != ntimers; ++t) {
76 timers_[t] = dur_t::zero();
77 tstart_[t] = time_point_t();
78 }
79 }
80
81 private:
82 constexpr static auto ntimers = N;
83 dur_t timers_[ntimers];
84 time_point_t tstart_[ntimers];
85 dur_t overhead_; // the duration of now() call ... use this to automatically
86 // adjust reported timings is you need fine-grained timing
87};
88
89} // namespace libint2
90
91#endif // C++11 or later
92
93#endif // defined(__cplusplus)
94
95#endif // header guard
Timers aggregates N C++11 "timers"; used to high-resolution profile stages of integral computation.
Definition timer.h:39
double read(size_t t) const
reads value (in seconds) of timer t , converted to double
Definition timer.h:72
dur_t stop(size_t t)
stops timer t
Definition timer.h:65
void clear()
resets timers to zero
Definition timer.h:74
static time_point_t now()
returns the current time point
Definition timer.h:51
void set_now_overhead(size_t ns)
use this to report the overhead of now() call; if set, the reported timings will be adjusted for this...
Definition timer.h:58
void start(size_t t)
starts timer t
Definition timer.h:61
Defaults definitions for various parameters assumed by Libint.
Definition algebra.cc:24