diff options
-rw-r--r-- | utils/gen_adldata/measurer.cpp | 20 | ||||
-rw-r--r-- | utils/gen_adldata/measurer.h | 4 |
2 files changed, 21 insertions, 3 deletions
diff --git a/utils/gen_adldata/measurer.cpp b/utils/gen_adldata/measurer.cpp index 3270463..8785254 100644 --- a/utils/gen_adldata/measurer.cpp +++ b/utils/gen_adldata/measurer.cpp @@ -1044,10 +1044,24 @@ void MeasureThreaded::destData::callback(void *myself) if(s->bd) { + OperatorsKey ok = {s->bd_ins->ops[0], s->bd_ins->ops[1], s->bd_ins->ops[2], s->bd_ins->ops[3], + static_cast<int_fast32_t>(s->bd_ins->fbConn), + s->bd_ins->noteOffset1, s->bd_ins->noteOffset2, + static_cast<int_fast32_t>(s->bd_ins->percussionKeyNumber), + static_cast<int_fast32_t>(s->bd_ins->instFlags)}; + DurationInfoCacheX::iterator cachedEntry = s->myself->m_durationInfoX.find(ok); + if(cachedEntry != s->myself->m_durationInfoX.end()) + { + const DurationInfo &di = cachedEntry->second; + s->bd_ins->delay_on_ms = di.ms_sound_kon; + s->bd_ins->delay_off_ms = di.ms_sound_koff; + s->myself->m_cache_matches++; + goto endWork; + } info = MeasureDurations(*s->bd, *s->bd_ins, &dosbox); - // s->myself->m_durationInfo_mx.lock(); - // s->myself->m_durationInfo.insert({s->i->first, info}); - // s->myself->m_durationInfo_mx.unlock(); + s->myself->m_durationInfo_mx.lock(); + s->myself->m_durationInfoX.insert({ok, info}); + s->myself->m_durationInfo_mx.unlock(); } else { diff --git a/utils/gen_adldata/measurer.h b/utils/gen_adldata/measurer.h index d02b2e4..ddc66bc 100644 --- a/utils/gen_adldata/measurer.h +++ b/utils/gen_adldata/measurer.h @@ -6,6 +6,7 @@ #include <mutex> #include <condition_variable> #include <thread> +#include <array> #include "progs_cache.h" @@ -54,7 +55,9 @@ private: struct MeasureThreaded { + typedef std::array<int_fast32_t, 9> OperatorsKey; typedef std::map<ins, DurationInfo> DurationInfoCache; + typedef std::map<OperatorsKey, DurationInfo> DurationInfoCacheX; MeasureThreaded() : m_semaphore(int(std::thread::hardware_concurrency()) * 2), @@ -65,6 +68,7 @@ struct MeasureThreaded Semaphore m_semaphore; std::mutex m_durationInfo_mx; DurationInfoCache m_durationInfo; + DurationInfoCacheX m_durationInfoX; std::atomic_bool m_delete_tail; size_t m_total = 0; std::atomic<size_t> m_done; |