/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include "MethodStatistics.h" #include #include #include #include namespace android::mediautils { class ScopedStatistics { public: /** * ScopedStatistics is a RAII way of obtaining * execution time statistics for a scoped C++ block. * * It updates the MethodStatistics shared pointer parameter * with the methodName parameter and the duration/lifetime of the * ScopedStatistics object. * * Not thread-safe, but expected to run in a single execution * thread, and there are no user serviceable parts exposed. * * Example: * * std::shared_ptr> stats = * std::make_shared>(); * * // ... * { * mediautils::ScopedStatistics scopedStatistics("MyClass:myMethod", stats); * * // some work to be timed here - up to the end of the block. * } * * \param methodName the methodname to use "ClassName::methodName" * \param statistics a shared ptr to the MethodStatistics object to use. */ ScopedStatistics(std::string methodName, std::shared_ptr> statistics) : mMethodName{std::move(methodName)} , mStatistics{std::move(statistics)} , mBegin{std::chrono::steady_clock::now()} {} // No copy constructor. ScopedStatistics(const ScopedStatistics& scopedStatistics) = delete; ScopedStatistics& operator=(const ScopedStatistics& scopedStatistics) = delete; ~ScopedStatistics() { if (mStatistics) { const float elapsedMs = std::chrono::duration_cast( std::chrono::steady_clock::now() - mBegin) .count() * 1e-6; // ns to ms. mStatistics->event(mMethodName, elapsedMs); } } private: const std::string mMethodName; const std::shared_ptr> mStatistics; const std::chrono::steady_clock::time_point mBegin; }; } // namespace android::mediautils