Browse Source

perf: speed up basic ranges generate

master
Dnomd343 2 years ago
parent
commit
8a0c7b418e
  1. 2
      src/all_cases/basic_ranges.cc
  2. 193
      src/basic_ranges_demo.cc

2
src/all_cases/basic_ranges.cc

@ -57,7 +57,7 @@ void BasicRanges::build_data() { // build basic ranges
} }
} }
} }
// std::sort(BasicRanges::data.begin(), BasicRanges::data.end()); // sort basic ranges std::sort(BasicRanges::data.begin(), BasicRanges::data.end()); // sort basic ranges
// for (auto &range : BasicRanges::data) { // for (auto &range : BasicRanges::data) {
// range = Common::range_reverse(range); // basic ranges reverse // range = Common::range_reverse(range); // basic ranges reverse
// } // }

193
src/basic_ranges_demo.cc

@ -224,11 +224,8 @@ br_t dat[] = {
{2, 0, 7, 0}, {2, 0, 7, 0},
}; };
//int dat_size = 4;
int dat_size = 204; int dat_size = 204;
//int dat_size = 1;
//void func(uint32_t prefix, int offset, br_t &r) {
void func(uint32_t prefix, int offset) { void func(uint32_t prefix, int offset) {
// std::cout << "build: "; // std::cout << "build: ";
@ -237,164 +234,161 @@ void func(uint32_t prefix, int offset) {
// show_br_t(dat[1]); // show_br_t(dat[1]);
// printf(" | prefix = %08X | offset = %d\n", prefix, offset); // printf(" | prefix = %08X | offset = %d\n", prefix, offset);
if (dat_s.n1 == 0 && dat_s.n2 == 0 && dat_s.n3 == 0 && dat_s.n4 == 0) { if (dat_s.n1 == 0 && dat_s.n2 == 0 && dat_s.n3 == 0 && dat_s.n4 == 0) {
// printf("release -> %08X\n", prefix); // printf("release -> %08X\n", prefix);
release_data.emplace_back(prefix); release_data.emplace_back(prefix);
return; return;
} }
// for (int i = 0; i < dat_size; ++i) {
// if (dat[i].n1 == 0 && dat[i].n2 == 0 && dat[i].n3 == 0 && dat[i].n4 == 0) {
//// printf("release -> %08X\n", prefix);
// return;
// }
// }
if (dat_s.n1 < 0 || dat_s.n2 < 0 || dat_s.n3 < 0 || dat_s.n4 < 0) { if (dat_s.n1 < 0 || dat_s.n2 < 0 || dat_s.n3 < 0 || dat_s.n4 < 0) {
// std::cout << "break" << std::endl; // std::cout << "break" << std::endl;
return; return;
} }
// bool flag = false;
// for (int i = 0; i < dat_size; ++i) {
// if (!(dat[i].n1 < 0 || dat[i].n2 < 0 || dat[i].n3 < 0 || dat[i].n4 < 0)) {
// flag = true;
// }
// }
// if (!flag) {
// return;
// }
/// generate start with 00 /// generate start with 00
--dat_s.n1; --dat_s.n1;
func(prefix | ((uint32_t)0b00 << 30) >> offset, offset + 2); func(prefix | ((uint32_t)0b00 << 30) >> offset, offset + 2);
++dat_s.n1; ++dat_s.n1;
// for (int i = 0; i < dat_size; ++i) {
// --dat[i].n1;
// }
// func(prefix | ((uint32_t)0b00 << 30) >> offset, offset + 2);
// for (int i = 0; i < dat_size; ++i) {
// ++dat[i].n1;
// }
/// generate start with 01 /// generate start with 01
--dat_s.n2; --dat_s.n2;
func(prefix | ((uint32_t)0b01 << 30) >> offset, offset + 2); func(prefix | ((uint32_t)0b01 << 30) >> offset, offset + 2);
++dat_s.n2; ++dat_s.n2;
// for (int i = 0; i < dat_size; ++i) {
// --dat[i].n2;
// }
// func(prefix | ((uint32_t)0b01 << 30) >> offset, offset + 2);
// for (int i = 0; i < dat_size; ++i) {
// ++dat[i].n2;
// }
/// generate start with 10 /// generate start with 10
--dat_s.n3; --dat_s.n3;
func(prefix | ((uint32_t)0b10 << 30) >> offset, offset + 2); func(prefix | ((uint32_t)0b10 << 30) >> offset, offset + 2);
++dat_s.n3; ++dat_s.n3;
// for (int i = 0; i < dat_size; ++i) {
// --dat[i].n3;
// }
// func(prefix | ((uint32_t)0b10 << 30) >> offset, offset + 2);
// for (int i = 0; i < dat_size; ++i) {
// ++dat[i].n3;
// }
/// generate start with 11 /// generate start with 11
--dat_s.n4; --dat_s.n4;
func(prefix | ((uint32_t)0b11 << 30) >> offset, offset + 2); func(prefix | ((uint32_t)0b11 << 30) >> offset, offset + 2);
++dat_s.n4; ++dat_s.n4;
// for (int i = 0; i < dat_size; ++i) {
// --dat[i].n4;
// }
// func(prefix | ((uint32_t)0b11 << 30) >> offset, offset + 2);
// for (int i = 0; i < dat_size; ++i) {
// ++dat[i].n4;
// }
} }
void func_test(const br_t &start) { void func_test(const br_t &start) {
struct inner_t { struct inner_t {
int n1; // int n1;
int n2; // int n2;
int n3; // int n3;
int n4; // int n4;
/// n4 n3 n2 n1
/// 00000000 00000000 00000000 00000000
uint32_t n;
uint32_t prefix; uint32_t prefix;
uint32_t offset; int offset;
}; };
auto show_inner = [](inner_t &d) { auto show_inner = [](inner_t &d) {
printf("(%d, %d, %d, %d) | %08X [%d]\n", d.n1, d.n2, d.n3, d.n4, d.prefix, d.offset); // printf("(%d, %d, %d, %d) | %08X [%d]\n", d.n1, d.n2, d.n3, d.n4, d.prefix, d.offset);
printf(
"(%d, %d, %d, %d) | %08X [%d]\n",
d.n & 0xFF,
(d.n >> 8) & 0xFF,
(d.n >> 16) & 0xFF,
(d.n >> 24) & 0xFF,
d.prefix,
d.offset
);
}; };
std::queue<inner_t> data; std::queue<inner_t> data;
data.emplace(inner_t { data.emplace(inner_t {
.n1 = start.n1, // .n1 = start.n1,
.n2 = start.n2, // .n2 = start.n2,
.n3 = start.n3, // .n3 = start.n3,
.n4 = start.n4, // .n4 = start.n4,
.n = static_cast<uint32_t>(start.n1 | (start.n2 << 8) | (start.n3 << 16) | (start.n4 << 24)),
.prefix = 0, .prefix = 0,
.offset = 0, .offset = 0,
}); });
// show_inner(data.front());
while (!data.empty()) { while (!data.empty()) {
// show_inner(data.front()); // show_inner(data.front());
if (data.front().n1 == 0 && data.front().n2 == 0 && data.front().n3 == 0 && data.front().n4 == 0) { // if (data.front().n1 == 0 && data.front().n2 == 0 && data.front().n3 == 0 && data.front().n4 == 0) {
// printf("%08X\n", data.front().prefix); //// printf("%08X\n", data.front().prefix);
//
release_data.push_back(data.front().prefix); // release_data.push_back(data.front().prefix);
//
// data.pop();
// continue;
// }
data.pop(); if (data.front().n == 0) {
continue; // printf("release -> %08X\n", data.front().prefix);
release_data.emplace_back(data.front().prefix);
} }
if (data.front().n1 != 0) { // if (data.front().n1 != 0) {
auto next = inner_t{ if ((data.front().n & 0xFF) != 0) {
.n1 = data.front().n1 - 1, // auto next = inner_t{
.n2 = data.front().n2, // .n1 = data.front().n1 - 1,
.n3 = data.front().n3, // .n2 = data.front().n2,
.n4 = data.front().n4, // .n3 = data.front().n3,
// .n4 = data.front().n4,
// .prefix = data.front().prefix | (((uint32_t) 0b00 << 30) >> data.front().offset),
// .offset = data.front().offset + 2,
// };
auto next = inner_t {
.n = data.front().n - 0x01,
.prefix = data.front().prefix | (((uint32_t) 0b00 << 30) >> data.front().offset), .prefix = data.front().prefix | (((uint32_t) 0b00 << 30) >> data.front().offset),
.offset = data.front().offset + 2, .offset = data.front().offset + 2,
}; };
data.emplace(next); data.emplace(next);
} }
if (data.front().n2 != 0) { // if (data.front().n2 != 0) {
auto next = inner_t{ if ((data.front().n & 0xFF00) != 0) {
.n1 = data.front().n1, // auto next = inner_t{
.n2 = data.front().n2 - 1, // .n1 = data.front().n1,
.n3 = data.front().n3, // .n2 = data.front().n2 - 1,
.n4 = data.front().n4, // .n3 = data.front().n3,
// .n4 = data.front().n4,
// .prefix = data.front().prefix | (((uint32_t) 0b01 << 30) >> data.front().offset),
// .offset = data.front().offset + 2,
// };
auto next = inner_t {
.n = data.front().n - 0x0100,
.prefix = data.front().prefix | (((uint32_t) 0b01 << 30) >> data.front().offset), .prefix = data.front().prefix | (((uint32_t) 0b01 << 30) >> data.front().offset),
.offset = data.front().offset + 2, .offset = data.front().offset + 2,
}; };
data.emplace(next); data.emplace(next);
} }
if (data.front().n3 != 0) { // if (data.front().n3 != 0) {
auto next = inner_t{ if ((data.front().n & 0xFF0000) != 0) {
.n1 = data.front().n1, // auto next = inner_t{
.n2 = data.front().n2, // .n1 = data.front().n1,
.n3 = data.front().n3 - 1, // .n2 = data.front().n2,
.n4 = data.front().n4, // .n3 = data.front().n3 - 1,
// .n4 = data.front().n4,
// .prefix = data.front().prefix | (((uint32_t) 0b10 << 30) >> data.front().offset),
// .offset = data.front().offset + 2,
// };
auto next = inner_t {
.n = data.front().n - 0x010000,
.prefix = data.front().prefix | (((uint32_t) 0b10 << 30) >> data.front().offset), .prefix = data.front().prefix | (((uint32_t) 0b10 << 30) >> data.front().offset),
.offset = data.front().offset + 2, .offset = data.front().offset + 2,
}; };
data.emplace(next); data.emplace(next);
} }
if (data.front().n4 != 0) { // if (data.front().n4 != 0) {
auto next = inner_t{ if ((data.front().n & 0xFF000000) != 0) {
.n1 = data.front().n1, // auto next = inner_t{
.n2 = data.front().n2, // .n1 = data.front().n1,
.n3 = data.front().n3, // .n2 = data.front().n2,
.n4 = data.front().n4 - 1, // .n3 = data.front().n3,
// .n4 = data.front().n4 - 1,
// .prefix = data.front().prefix | (((uint32_t) 0b11 << 30) >> data.front().offset),
// .offset = data.front().offset + 2,
// };
auto next = inner_t {
.n = data.front().n - 0x01000000,
.prefix = data.front().prefix | (((uint32_t) 0b11 << 30) >> data.front().offset), .prefix = data.front().prefix | (((uint32_t) 0b11 << 30) >> data.front().offset),
.offset = data.front().offset + 2, .offset = data.front().offset + 2,
}; };
@ -404,17 +398,6 @@ void func_test(const br_t &start) {
data.pop(); data.pop();
} }
// std::cout << "Size: " << data.size() << std::endl;
// data.pop();
//
// show_inner(data.front());
//
// data.pop();
//
// show_inner(data.front());
} }
@ -444,6 +427,7 @@ void load_ranges() {
// } // }
// sort(release_data.begin(), release_data.end()); // sort(release_data.begin(), release_data.end());
// func_test(br_t { // func_test(br_t {
// .n1 = 7, // .n1 = 7,
// .n2 = 2, // .n2 = 2,
@ -456,10 +440,6 @@ void load_ranges() {
// .n4 = 0, // .n4 = 0,
// }); // });
// dat_s = {3, 1, 3, 5};
//
// func(0, 0);
for (int i = 0; i < dat_size; ++i) { for (int i = 0; i < dat_size; ++i) {
func_test(dat[i]); func_test(dat[i]);
} }
@ -467,9 +447,4 @@ void load_ranges() {
sort(release_data.begin(), release_data.end()); sort(release_data.begin(), release_data.end());
std::cout << "size: " << release_data.size() << std::endl; std::cout << "size: " << release_data.size() << std::endl;
// br_t demo = {2, 0, 0, 1};
// func(0, 0, demo);
// show_br_t(r);
} }

Loading…
Cancel
Save