blob: 5db29828f2eaee1a45431eb916d6017d6e7ee63d [file] [log] [blame]
//
// 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