From d6eaef8864980a13a0c3f770c0cea200ce9dbd6f Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Thu, 12 Jan 2023 15:06:46 +0800 Subject: [PATCH] feat: try less function calls --- src/core/core.cc | 7 ++++--- src/core/core.h | 13 ++++++++----- src/fast_cal/fast_cal.cc | 27 ++++++++++++++++++++++++++- src/fast_cal/fast_cal.h | 1 + 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/core/core.cc b/src/core/core.cc index 17f1e45..6f2709b 100644 --- a/src/core/core.cc +++ b/src/core/core.cc @@ -172,9 +172,10 @@ void Core::next_step(uint64_t code, uint64_t mask) { // search next step cases if (cache_size != 1) { // found one or more next cases // TODO: try to send multi-items data - for (int i = 1; i < cache_size; ++i) { - release(cache[i].code, cache[i].mask); // release next cases - } +// for (int i = 1; i < cache_size; ++i) { +// release(cache[i].code, cache[i].mask); // release next cases +// } + release(cache, cache_size); cache_size = 1; // reset cache size } diff --git a/src/core/core.h b/src/core/core.h index d6e1f82..f84c73a 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -11,12 +11,7 @@ class Core { public: - typedef std::function release_t; - void next_step(uint64_t code, uint64_t mask); - explicit Core(release_t release_func) : release(std::move(release_func)) {} - -private: struct cache_t { uint64_t code; // case raw code uint64_t mask; // only 000 or 111 @@ -24,6 +19,14 @@ private: int addr; // (0 ~ 19) * 3 }; +// typedef std::function release_t; + typedef std::function release_t; + + void next_step(uint64_t code, uint64_t mask); + explicit Core(release_t release_func) : release(std::move(release_func)) {} + +private: + int cache_size = 1; cache_t cache[16] = {0}; release_t release; // release code and mask diff --git a/src/fast_cal/fast_cal.cc b/src/fast_cal/fast_cal.cc index 90051d0..682a8e8 100644 --- a/src/fast_cal/fast_cal.cc +++ b/src/fast_cal/fast_cal.cc @@ -12,7 +12,8 @@ void FastCal::fast_cal(uint64_t code) { auto core = Core( [this](auto &&p1, auto &&p2) { - add_new_case(std::forward(p1), std::forward(p2)); +// add_new_case(std::forward(p1), std::forward(p2)); + add_new_case_demo(std::forward(p1), std::forward(p2)); } ); @@ -66,3 +67,27 @@ void FastCal::add_new_case(uint64_t code, uint64_t mask) { cache.emplace(&cases[code]); } + +void FastCal::add_new_case_demo(Core::cache_t *cache_dat, int cache_size) { + + for (int i = 1; i < cache_size; ++i) { + uint64_t code = cache_dat[i].code; + uint64_t mask = cache_dat[i].mask; + + auto exist_case = cases.find(code); + if (exist_case != cases.end()) { + exist_case->second.mask |= mask; + continue; + } + + cases[code] = fast_cal_t { + .code = code, + .mask = mask, + .last = cache.front(), + }; + cache.emplace(&cases[code]); + + } + + +} diff --git a/src/fast_cal/fast_cal.h b/src/fast_cal/fast_cal.h index f8dbc68..aa2bf73 100644 --- a/src/fast_cal/fast_cal.h +++ b/src/fast_cal/fast_cal.h @@ -18,5 +18,6 @@ public: void fast_cal(uint64_t code); void add_new_case(uint64_t code, uint64_t mask); + void add_new_case_demo(Core::cache_t *cache_dat, int cache_size); };