| // |
| // Copyright 2015 Google Inc. All Rights Reserved. |
| // |
| // 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. |
| // |
| |
| $$ This is a pump file for generating the interface and implementation of |
| $$ the benchmarking system's TRACE_EVENT_BENCHMARK* macros, which can take a |
| $$ variable number of parameters. Pump is a python script that is part of the |
| $$ Google Test suite of utilities. Description can be found here: |
| $$ |
| $$ http://code.google.com/p/googletest/wiki/PumpManual |
| $$ |
| |
| #include "base/compiler_specific.h" |
| |
| // clang-format off |
| |
| $var MAX_ARITY = 10 |
| |
| $range ARITY 1..MAX_ARITY |
| |
| $for ARITY [[ |
| |
| $range ARG 1..ARITY |
| |
| #define TRACE_EVENT_BENCHMARK$(ARITY)(benchmark, $for ARG , [[event_name_$(ARG), measurement_type_$(ARG)]])\ |
| MSVC_PUSH_DISABLE_WARNING(6326)\ |
| class benchmark : public cobalt::trace_event::Benchmark {\ |
| public:\ |
| void Experiment() override;\ |
| void AnalyzeTraceEvent(\ |
| const scoped_refptr<cobalt::trace_event::EventParser::ScopedEvent>& event)\ |
| override {\ |
| |
| $for ARG |
| [[ |
| if (event->name() == event_name_$(ARG)) {\ |
| switch (measurement_type_$(ARG)) {\ |
| case cobalt::trace_event::FLOW_DURATION: {\ |
| if (event->flow_duration()) {\ |
| event_$(ARG)_samples_.push_back(\ |
| event->flow_duration()->InSecondsF());\ |
| }\ |
| } break;\ |
| case cobalt::trace_event::IN_SCOPE_DURATION: {\ |
| if (event->in_scope_duration()) {\ |
| event_$(ARG)_samples_.push_back(\ |
| event->in_scope_duration()->InSecondsF());\ |
| }\ |
| } break;\ |
| case cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS: {\ |
| if (!event_$(ARG)_last_begin_time_.is_null()) {\ |
| event_$(ARG)_samples_.push_back(\ |
| (event->begin_event().timestamp() -\ |
| event_$(ARG)_last_begin_time_).InSecondsF());\ |
| }\ |
| } break;\ |
| }\ |
| \ |
| event_$(ARG)_last_begin_time_ = event->begin_event().timestamp();\ |
| }\ |
| |
| ]] |
| }\ |
| std::vector<Result> CompileResults() override {\ |
| std::vector<Result> results;\ |
| |
| $for ARG |
| [[ |
| switch (measurement_type_$(ARG)) {\ |
| case cobalt::trace_event::FLOW_DURATION: {\ |
| results.push_back(\ |
| Result(std::string(event_name_$(ARG)) +\ |
| " flow duration in seconds", \ |
| event_$(ARG)_samples_));\ |
| } break;\ |
| case cobalt::trace_event::IN_SCOPE_DURATION: {\ |
| results.push_back(\ |
| Result(std::string(event_name_$(ARG)) +\ |
| " in-scope duration in seconds", \ |
| event_$(ARG)_samples_));\ |
| } break;\ |
| case cobalt::trace_event::TIME_BETWEEN_EVENT_STARTS: {\ |
| results.push_back(\ |
| Result(std::string(event_name_$(ARG)) +\ |
| " time between event starts in seconds", \ |
| event_$(ARG)_samples_));\ |
| } break;\ |
| }\ |
| |
| ]] |
| return results;\ |
| }\ |
| private:\ |
| |
| $for ARG |
| [[ |
| std::vector<double> event_$(ARG)_samples_;\ |
| base::TimeTicks event_$(ARG)_last_begin_time_;\ |
| |
| ]] |
| };\ |
| \ |
| TRACE_EVENT_REGISTER_BENCHMARK(benchmark)\ |
| \ |
| void benchmark::Experiment()\ |
| MSVC_POP_WARNING() |
| |
| ]] |
| |
| // clang-format on |