|
|
@ -13,7 +13,10 @@ |
|
|
|
|
|
|
|
using klotski::cases::AllCases; |
|
|
|
|
|
|
|
using klotski::group::CaseInfo; |
|
|
|
|
|
|
|
using klotski::group::Group; |
|
|
|
using klotski::group::GroupCases; |
|
|
|
using klotski::group::GroupUnion; |
|
|
|
|
|
|
|
using klotski::codec::RawCode; |
|
|
@ -323,6 +326,75 @@ static void ToHorizontalMirror(benchmark::State &state) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static void FastObtainCode(benchmark::State &state) { |
|
|
|
// GroupCases::build();
|
|
|
|
|
|
|
|
// std::vector<CaseInfo> infos;
|
|
|
|
// for (auto code : common_code_samples(64)) {
|
|
|
|
// infos.emplace_back(GroupCases::tiny_obtain_info(code));
|
|
|
|
// }
|
|
|
|
// infos.emplace_back(CaseInfo::unsafe_create())
|
|
|
|
|
|
|
|
const auto group = Group::unsafe_create(169, 0, Group::Toward::C); |
|
|
|
const klotski::cases::RangesUnion data = group.cases(); |
|
|
|
|
|
|
|
std::array<size_t, 16> sizes {}; |
|
|
|
size_t offset = 0; |
|
|
|
for (int i = 0; i < 16; ++i) { |
|
|
|
sizes[i] = offset; |
|
|
|
offset += data[i].size(); |
|
|
|
} |
|
|
|
|
|
|
|
std::vector infos { |
|
|
|
CaseInfo::unsafe_create(group, 2631), |
|
|
|
CaseInfo::unsafe_create(group, 4203), |
|
|
|
CaseInfo::unsafe_create(group, 4504), |
|
|
|
CaseInfo::unsafe_create(group, 5178), |
|
|
|
CaseInfo::unsafe_create(group, 5411), |
|
|
|
CaseInfo::unsafe_create(group, 7208), |
|
|
|
CaseInfo::unsafe_create(group, 8385), |
|
|
|
CaseInfo::unsafe_create(group, 9821), |
|
|
|
CaseInfo::unsafe_create(group, 14220), |
|
|
|
CaseInfo::unsafe_create(group, 16159), |
|
|
|
CaseInfo::unsafe_create(group, 16224), |
|
|
|
CaseInfo::unsafe_create(group, 18027), |
|
|
|
CaseInfo::unsafe_create(group, 20271), |
|
|
|
CaseInfo::unsafe_create(group, 20980), |
|
|
|
CaseInfo::unsafe_create(group, 21130), |
|
|
|
CaseInfo::unsafe_create(group, 22794), |
|
|
|
}; |
|
|
|
|
|
|
|
for (auto _ : state) { |
|
|
|
// for (auto info : infos) {
|
|
|
|
// volatile auto kk = GroupCases::fast_obtain_code(info);
|
|
|
|
// }
|
|
|
|
// volatile auto kk = GroupCases::fast_obtain_code(info);
|
|
|
|
|
|
|
|
for (auto info : infos) { |
|
|
|
/// about 35ns
|
|
|
|
auto &cases = data; |
|
|
|
uint64_t head = 0; |
|
|
|
auto case_id = info.case_id(); |
|
|
|
for (;;) { |
|
|
|
if (case_id >= cases[head].size()) { |
|
|
|
case_id -= cases[head].size(); |
|
|
|
++head; |
|
|
|
} else { |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
auto range = cases[head][case_id]; |
|
|
|
volatile auto kk = CommonCode::unsafe_create(head << 32 | range); |
|
|
|
|
|
|
|
/// about 117ns
|
|
|
|
// uint64_t head = std::upper_bound(sizes.begin(), sizes.end(), info.case_id()) - sizes.begin() - 1;
|
|
|
|
// uint32_t range = data[head][info.case_id() - sizes[head]];
|
|
|
|
// volatile auto kk = CommonCode::unsafe_create(head << 32 | range);
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// BENCHMARK(CommonCodeToTypeId)->Arg(8)->Arg(64)->Arg(256);
|
|
|
|
// BENCHMARK(RawCodeToTypeId)->Arg(8)->Arg(64)->Arg(256);
|
|
|
|
|
|
|
@ -338,10 +410,12 @@ static void ToHorizontalMirror(benchmark::State &state) { |
|
|
|
|
|
|
|
// BENCHMARK(RangesDerive)->Unit(benchmark::kMillisecond);
|
|
|
|
|
|
|
|
BENCHMARK(SpawnGroups); |
|
|
|
// BENCHMARK(SpawnGroups);
|
|
|
|
|
|
|
|
// BENCHMARK(GroupFromRawCode)->Unit(benchmark::kMillisecond);
|
|
|
|
|
|
|
|
BENCHMARK(FastObtainCode); |
|
|
|
|
|
|
|
// BENCHMARK(IsVerticalMirror);
|
|
|
|
// BENCHMARK(IsHorizontalMirror);
|
|
|
|
// BENCHMARK(ToVerticalMirror);
|
|
|
|