1 // 2 // Copyright © 2022 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #pragma once 7 #include <chrono> 8 #include <iostream> 9 #include <string> 10 11 using namespace std::chrono; 12 13 namespace common 14 { 15 /** 16 * @brief Used for meausuring performance of specific actions in the code. 17 * Profiling should be enabled with a parameter passed to the constructor and 18 * it's disabled by default. 19 * In order to measure timing, wrap the desired code section with 20 * ProfilingStart() and ProfilingStopAndPrintUs(title) 21 */ 22 class Profiling { 23 private: 24 25 struct group_thousands : std::numpunct<char> 26 { do_groupingcommon::Profiling::group_thousands27 std::string do_grouping() const override { return "\3"; } 28 }; 29 30 bool mProfilingEnabled{}; 31 steady_clock::time_point mStart{}; 32 steady_clock::time_point mStop{}; 33 public: Profiling()34 Profiling() : mProfilingEnabled(false) {}; 35 36 /** 37 * @brief Initializes the profiling object. 38 * 39 * * @param[in] isEnabled - Enables the profiling computation and prints. 40 */ Profiling(bool isEnabled)41 explicit Profiling(bool isEnabled) : mProfilingEnabled(isEnabled) {}; 42 43 /** 44 * @brief Starts the profiling measurement. 45 * 46 */ 47 ProfilingStart()48 void ProfilingStart() 49 { 50 if (mProfilingEnabled) 51 { 52 mStart = steady_clock::now(); 53 } 54 } 55 56 /** 57 * @brief Stops the profiling measurement, without printing the results. 58 * 59 */ ProfilingStop()60 auto ProfilingStop() 61 { 62 if (mProfilingEnabled) 63 { 64 mStop = steady_clock::now(); 65 } 66 } 67 68 /** 69 * @brief Get the measurement result in micro-seconds. 70 * 71 */ ProfilingGetUs()72 auto ProfilingGetUs() 73 { 74 return mProfilingEnabled ? duration_cast<microseconds>(mStop - mStart).count() : 0; 75 } 76 77 /** 78 * @brief Stop the profiling measurement and print the result in micro-seconds. 79 * 80 */ ProfilingStopAndPrintUs(const std::string & title)81 void ProfilingStopAndPrintUs(const std::string &title) 82 { 83 ProfilingStop(); 84 if (mProfilingEnabled) { 85 std::cout.imbue(std::locale(std::cout.getloc(), new group_thousands)); 86 std::cout << "Profiling: " << title << ": " << ProfilingGetUs() << " uSeconds" << std::endl; 87 } 88 } 89 }; 90 }// namespace common