blob: 339d6ea576b8b5f40a1d5e234d7e57fdbf9ef471 [file] [log] [blame]
/*
* Copyright (C) 2020 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.
*/
#include "src/trace_processor/rpc/query_result_serializer.h"
#include <benchmark/benchmark.h>
#include "perfetto/trace_processor/basic_types.h"
#include "perfetto/trace_processor/trace_processor.h"
using perfetto::trace_processor::Config;
using perfetto::trace_processor::QueryResultSerializer;
using perfetto::trace_processor::TraceProcessor;
using VectorType = std::vector<uint8_t>;
namespace {
bool IsBenchmarkFunctionalOnly() {
return getenv("BENCHMARK_FUNCTIONAL_TEST_ONLY") != nullptr;
}
void BenchmarkArgs(benchmark::internal::Benchmark* b) {
if (IsBenchmarkFunctionalOnly()) {
b->Ranges({{1024, 1024}, {4096, 4096}});
} else {
b->RangeMultiplier(8)->Ranges({{128, 8192}, {4096, 1024 * 512}});
}
}
void RunQueryChecked(TraceProcessor* tp, const std::string& query) {
auto iter = tp->ExecuteQuery(query);
iter.Next();
PERFETTO_CHECK(iter.Status().ok());
}
} // namespace
static void BM_QueryResultSerializer_Mixed(benchmark::State& state) {
auto tp = TraceProcessor::CreateInstance(Config());
RunQueryChecked(tp.get(), "create virtual table win using window;");
RunQueryChecked(tp.get(),
"update win set window_start=0, window_dur=50000, quantum=1 "
"where rowid = 0");
VectorType buf;
for (auto _ : state) {
auto iter = tp->ExecuteQuery(
"select dur || dur as x, ts, dur * 1.0 as dur, quantum_ts from win");
QueryResultSerializer serializer(std::move(iter));
serializer.set_batch_size_for_testing(
static_cast<uint32_t>(state.range(0)),
static_cast<uint32_t>(state.range(1)));
while (serializer.Serialize(&buf)) {
}
benchmark::DoNotOptimize(buf.data());
buf.clear();
}
benchmark::ClobberMemory();
}
static void BM_QueryResultSerializer_Strings(benchmark::State& state) {
auto tp = TraceProcessor::CreateInstance(Config());
RunQueryChecked(tp.get(), "create virtual table win using window;");
RunQueryChecked(tp.get(),
"update win set window_start=0, window_dur=100000, quantum=1 "
"where rowid = 0");
VectorType buf;
for (auto _ : state) {
auto iter = tp->ExecuteQuery(
"select ts || '-' || ts , (dur * 1.0) || dur from win");
QueryResultSerializer serializer(std::move(iter));
serializer.set_batch_size_for_testing(
static_cast<uint32_t>(state.range(0)),
static_cast<uint32_t>(state.range(1)));
while (serializer.Serialize(&buf)) {
}
benchmark::DoNotOptimize(buf.data());
buf.clear();
}
benchmark::ClobberMemory();
}
BENCHMARK(BM_QueryResultSerializer_Mixed)->Apply(BenchmarkArgs);
BENCHMARK(BM_QueryResultSerializer_Strings)->Apply(BenchmarkArgs);