diff --git a/cpp/src/parquet/column/CMakeLists.txt b/cpp/src/parquet/column/CMakeLists.txt index d64be6c9ee2e8..344795c998f5f 100644 --- a/cpp/src/parquet/column/CMakeLists.txt +++ b/cpp/src/parquet/column/CMakeLists.txt @@ -32,3 +32,4 @@ ADD_PARQUET_TEST(properties-test) ADD_PARQUET_TEST(scanner-test) ADD_PARQUET_BENCHMARK(column-io-benchmark) +ADD_PARQUET_BENCHMARK(level-benchmark) diff --git a/cpp/src/parquet/column/level-benchmark.cc b/cpp/src/parquet/column/level-benchmark.cc new file mode 100644 index 0000000000000..fbb318141ee32 --- /dev/null +++ b/cpp/src/parquet/column/level-benchmark.cc @@ -0,0 +1,69 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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 "benchmark/benchmark.h" + +#include "parquet/column/levels.h" +#include "parquet/util/buffer.h" + +namespace parquet { + +namespace benchmark { + +static void BM_RleEncoding(::benchmark::State& state) { + // TODO: More than just all 0s + std::vector levels(state.range_x(), 0); + int16_t max_level = 1; + int64_t rle_size = LevelEncoder::MaxBufferSize(Encoding::RLE, max_level, levels.size()); + auto buffer_rle = std::make_shared(rle_size); + + while (state.KeepRunning()) { + LevelEncoder level_encoder; + level_encoder.Init(Encoding::RLE, max_level, levels.size(), + buffer_rle->mutable_data(), buffer_rle->size()); + level_encoder.Encode(levels.size(), levels.data()); + } + state.SetBytesProcessed(state.iterations() * state.range_x() * sizeof(int16_t)); +} + +BENCHMARK(BM_RleEncoding)->Range(1024, 65536); + +static void BM_RleDecoding(::benchmark::State& state) { + LevelEncoder level_encoder; + // TODO: More than just all 0s + std::vector levels(state.range_x(), 0); + int16_t max_level = 1; + int64_t rle_size = LevelEncoder::MaxBufferSize(Encoding::RLE, max_level, levels.size()); + auto buffer_rle = std::make_shared(rle_size); + level_encoder.Init(Encoding::RLE, max_level, levels.size(), buffer_rle->mutable_data(), + buffer_rle->size()); + level_encoder.Encode(levels.size(), levels.data()); + + while (state.KeepRunning()) { + LevelDecoder level_decoder; + level_decoder.SetData(Encoding::RLE, max_level, levels.size(), buffer_rle->data()); + level_decoder.Decode(state.range_x(), levels.data()); + } + + state.SetBytesProcessed(state.iterations() * state.range_x() * sizeof(int16_t)); +} + +BENCHMARK(BM_RleDecoding)->Range(1024, 65536); + +} // namespace benchmark + +} // namespace parquet