华容道高性能计算引擎
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

151 lines
4.6 KiB

#include <benchmark/benchmark.h>
#include "common_code/common_code.h"
#include "all_cases/all_cases.h"
using klotski::cases::AllCases;
using klotski::codec::CommonCode;
/// Build all valid CommonCodes.
static std::vector<uint64_t> all_common_codes() {
std::vector<uint64_t> codes;
for (uint64_t head = 0; head < 16; ++head) {
for (const auto range : AllCases::instance().fetch().ranges(head)) {
codes.emplace_back(head << 32 | range);
}
}
// std::cout << "do cal complete" << std::endl;
return codes;
}
std::vector<uint64_t> common_code_samples(uint64_t num) {
static auto codes = all_common_codes();
uint64_t part_size = codes.size() / num;
// uint64_t offset = 0;
uint64_t offset = part_size / 2;
std::vector<uint64_t> result;
for (uint64_t i = 0; i < num; ++i) {
uint64_t index = i * part_size + offset;
result.emplace_back(codes[index]);
}
return result;
}
std::vector<std::string> str_common_codes(uint64_t num, bool shorten) {
// auto src = select_codes(num);
auto src = common_code_samples(num);
std::vector<std::string> codes;
codes.reserve(src.size());
for (auto x : src) {
codes.emplace_back(klotski::codec::CommonCode::unsafe_create(x).to_string(shorten));
}
return codes;
}
static void CommonCodeCheck(benchmark::State &state) {
const auto samples = common_code_samples(state.range(0));
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::check(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeSerialize(benchmark::State &state) {
const auto samples = common_code_samples(state.range(0));
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::string_encode(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeDeserialize(benchmark::State &state) {
const auto tmp = str_common_codes(state.range(0), false);
const std::vector<std::string_view> samples {tmp.begin(), tmp.end()};
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::string_decode(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeSerializeShorten(benchmark::State &state) {
const auto samples = common_code_samples(state.range(0));
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::string_encode_shorten(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeDeserializeShorten(benchmark::State &state) {
const auto tmp = str_common_codes(state.range(0), true);
const std::vector<std::string_view> samples {tmp.begin(), tmp.end()};
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::string_decode(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeCheckMirror(benchmark::State &state) {
const auto samples = common_code_samples(state.range(0));
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::check_mirror(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeVerticalMirror(benchmark::State &state) {
const auto samples = common_code_samples(state.range(0));
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::get_vertical_mirror(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
static void CommonCodeHorizontalMirror(benchmark::State &state) {
const auto samples = common_code_samples(state.range(0));
for (auto _ : state) {
for (const auto code : samples) {
benchmark::DoNotOptimize(CommonCode::get_horizontal_mirror(code));
}
}
state.SetItemsProcessed(state.iterations() * state.range(0));
}
// BENCHMARK(CommonCodeCheck)->Range(8, 256);
// BENCHMARK(CommonCodeSerialize)->Range(8, 256);
// BENCHMARK(CommonCodeDeserialize)->Range(8, 256);
// BENCHMARK(CommonCodeSerializeShorten)->Range(8, 256);
// BENCHMARK(CommonCodeDeserializeShorten)->Range(8, 256);
// BENCHMARK(CommonCodeCheckMirror)->Range(64, 1024);
BENCHMARK(CommonCodeVerticalMirror)->Range(8, 256);
BENCHMARK(CommonCodeHorizontalMirror)->Range(8, 256);
BENCHMARK_MAIN();