| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Benchmarks for a reference encoder / decoder specialized to PaddedStructTree. |
| |
| #include <cstdint> |
| |
| #include "builder.h" |
| #include "decode_benchmark_util.h" |
| #include "encode_benchmark_util.h" |
| #include "util.h" |
| |
| namespace { |
| |
| bool EncodePaddedStructTree(void* value, const char** error, |
| fit::function<void(const uint8_t*, size_t)> callback) { |
| uint8_t buf[sizeof(llcpp::benchmarkfidl::PaddedStructTree8)]; |
| |
| uint64_t mask = 0xffffffff000000ff; |
| uint64_t* in = reinterpret_cast<uint64_t*>(value); |
| uint64_t* in_end = reinterpret_cast<uint64_t*>( |
| reinterpret_cast<llcpp::benchmarkfidl::PaddedStructTree8*>(value) + 1); |
| uint64_t* out = reinterpret_cast<uint64_t*>(buf); |
| for (; in < in_end; ++in, ++out) { |
| // Note: padding bytes are blindly zeroed rather than checking that existing padding data is |
| // zero because LLCPP does not require that padding bytes in values are zero. |
| *out = *in & mask; |
| } |
| callback(buf, sizeof(buf)); |
| return true; |
| } |
| |
| bool DecodePaddedStructTree(uint8_t* bytes, size_t bytes_size, zx_handle_t* handles, |
| size_t handles_size, const char** error) { |
| if (handles_size != 0) { |
| *error = "no handles expected"; |
| return false; |
| } |
| |
| uint64_t mask = 0x00000000ffffff00; |
| uint64_t* cur = reinterpret_cast<uint64_t*>(bytes); |
| uint64_t* end = |
| reinterpret_cast<uint64_t*>(bytes + sizeof(llcpp::benchmarkfidl::PaddedStructTree8)); |
| for (; cur < end; ++cur) { |
| if ((*cur & mask) != 0) { |
| *error = "non-zero padding byte"; |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| bool BenchmarkEncodePaddedStructTree(perftest::RepeatState* state) { |
| return encode_benchmark_util::EncodeBenchmark( |
| state, benchmark_suite::Build_PaddedStructTree_Depth8, EncodePaddedStructTree); |
| } |
| bool BenchmarkDecodePaddedStructTree(perftest::RepeatState* state) { |
| return decode_benchmark_util::DecodeBenchmark( |
| state, benchmark_suite::Build_PaddedStructTree_Depth8, DecodePaddedStructTree); |
| } |
| |
| void RegisterTests() { |
| perftest::RegisterTest("Reference/Encode/PaddedStructTree/Depth8", |
| BenchmarkEncodePaddedStructTree); |
| perftest::RegisterTest("Reference/Decode/PaddedStructTree/Depth8", |
| BenchmarkDecodePaddedStructTree); |
| } |
| PERFTEST_CTOR(RegisterTests) |
| |
| } // namespace |