X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fprofiler.h;h=7bb3b37508aa2b022762601ae7fc20a2f1ddd63a;hb=569fca53089b7b7e87b02edd44e2ad47166f7af6;hp=a30e34a7c77dd06558d7efa40bf755d61f0b043f;hpb=9d09103e481c4979ebb0130a9dee6265d0d6223b;p=minetest.git diff --git a/src/profiler.h b/src/profiler.h index a30e34a7c..7bb3b3750 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -38,42 +38,102 @@ class Profiler m_mutex.Init(); } - void add(const std::string &name, u32 duration) + void add(const std::string &name, float value) { JMutexAutoLock lock(m_mutex); - core::map::Node *n = m_data.find(name); - if(n == NULL) { - m_data[name] = duration; + /* No average shall have been used; mark add used as -2 */ + core::map::Node *n = m_avgcounts.find(name); + if(n == NULL) + m_avgcounts[name] = -2; + else{ + if(n->getValue() == -1) + n->setValue(-2); + assert(n->getValue() == -2); + } + } + { + core::map::Node *n = m_data.find(name); + if(n == NULL) + m_data[name] = value; + else + n->setValue(n->getValue() + value); + } + } + + void avg(const std::string &name, float value) + { + JMutexAutoLock lock(m_mutex); + { + core::map::Node *n = m_avgcounts.find(name); + if(n == NULL) + m_avgcounts[name] = 1; + else{ + /* No add shall have been used */ + assert(n->getValue() != -2); + if(n->getValue() <= 0) + n->setValue(1); + else + n->setValue(n->getValue() + 1); + } } - else { - n->setValue(n->getValue()+duration); + core::map::Node *n = m_data.find(name); + if(n == NULL) + m_data[name] = value; + else + n->setValue(n->getValue() + value); } } void clear() { JMutexAutoLock lock(m_mutex); - for(core::map::Iterator + for(core::map::Iterator i = m_data.getIterator(); i.atEnd() == false; i++) { i.getNode()->setValue(0); } + m_avgcounts.clear(); } void print(std::ostream &o) + { + printPage(o, 1, 1); + } + + void printPage(std::ostream &o, u32 page, u32 pagecount) { JMutexAutoLock lock(m_mutex); - for(core::map::Iterator + + u32 minindex, maxindex; + paging(m_data.size(), page, pagecount, minindex, maxindex); + + for(core::map::Iterator i = m_data.getIterator(); i.atEnd() == false; i++) { + if(maxindex == 0) + break; + maxindex--; + + if(minindex != 0) + { + minindex--; + continue; + } + std::string name = i.getNode()->getKey(); - o<::Node *n = m_avgcounts.find(name); + if(n){ + if(n->getValue() >= 1) + avgcount = n->getValue(); + } + o<<" "<getValue(); + o<<(i.getNode()->getValue() / avgcount); o< m_data; + core::map m_data; + core::map m_avgcounts; +}; + +enum ScopeProfilerType{ + SPT_ADD, + SPT_AVG }; class ScopeProfiler { public: - ScopeProfiler(Profiler *profiler, const std::string &name): + ScopeProfiler(Profiler *profiler, const std::string &name, + enum ScopeProfilerType type = SPT_ADD): m_profiler(profiler), m_name(name), - m_timer(NULL) + m_timer(NULL), + m_type(type) { if(m_profiler) m_timer = new TimeTaker(m_name.c_str()); } // name is copied - ScopeProfiler(Profiler *profiler, const char *name): + ScopeProfiler(Profiler *profiler, const char *name, + enum ScopeProfilerType type = SPT_ADD): m_profiler(profiler), m_name(name), - m_timer(NULL) + m_timer(NULL), + m_type(type) { if(m_profiler) m_timer = new TimeTaker(m_name.c_str()); @@ -115,9 +185,18 @@ class ScopeProfiler { if(m_timer) { - u32 duration = m_timer->stop(true); - if(m_profiler) - m_profiler->add(m_name, duration); + float duration_ms = m_timer->stop(true); + float duration = duration_ms / 1000.0; + if(m_profiler){ + switch(m_type){ + case SPT_ADD: + m_profiler->add(m_name, duration); + break; + case SPT_AVG: + m_profiler->avg(m_name, duration); + break; + } + } delete m_timer; } } @@ -125,6 +204,7 @@ class ScopeProfiler Profiler *m_profiler; std::string m_name; TimeTaker *m_timer; + enum ScopeProfilerType m_type; }; #endif