• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2021 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
24 #ifndef ARM_COMPUTE_TEST_WALL_CLOCK_TIMER
25 #define ARM_COMPUTE_TEST_WALL_CLOCK_TIMER
26 
27 #include "Instrument.h"
28 
29 #include <chrono>
30 
31 namespace arm_compute
32 {
33 namespace test
34 {
35 namespace framework
36 {
37 /** Implementation of an instrument to measure elapsed wall-clock time in milliseconds. */
38 template <bool output_timestamps>
39 class WallClock : public Instrument
40 {
41 public:
42     /** Construct a Wall clock timer.
43      *
44      * @param[in] scale_factor Measurement scale factor.
45      */
WallClock(ScaleFactor scale_factor)46     WallClock(ScaleFactor scale_factor)
47     {
48         switch(scale_factor)
49         {
50             case ScaleFactor::NONE:
51                 _scale_factor = 1.f;
52                 _unit         = "us";
53                 break;
54             case ScaleFactor::TIME_MS:
55                 _scale_factor = 1000.f;
56                 _unit         = "ms";
57                 break;
58             case ScaleFactor::TIME_S:
59                 _scale_factor = 1000000.f;
60                 _unit         = "s";
61                 break;
62             default:
63                 ARM_COMPUTE_ERROR("Invalid scale");
64         }
65     };
66 
67     std::string     id() const override;
68     void            start() override;
69     void            stop() override;
70     MeasurementsMap measurements() const override;
71 
72 private:
73 #if defined(BARE_METAL)
74     uint64_t _start {};
75     uint64_t _stop{};
76 #else  // !defined(BARE_METAL)
77     std::chrono::system_clock::time_point _start {};
78     std::chrono::system_clock::time_point _stop{};
79 #endif // defined(BARE_METAL)
80     float _scale_factor {};
81 };
82 
83 using WallClockTimer      = WallClock<false>;
84 using WallClockTimestamps = WallClock<true>;
85 } // namespace framework
86 } // namespace test
87 } // namespace arm_compute
88 #endif /* ARM_COMPUTE_TEST_WALL_CLOCK_TIMER */
89