X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fprofiler.h;h=25d89c6c8a6304fd77988ab50fc01189c0f5c5b3;hb=8852333eb3042580592ade478e5def20f8ed5d4c;hp=129118ef6216c567281044f1e8b8741f009f764a;hpb=2419d0029ac36952aaa74b685d529a3592adb6aa;p=oweals%2Fminetest.git diff --git a/src/profiler.h b/src/profiler.h index 129118ef6..25d89c6c8 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -20,11 +20,15 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef PROFILER_HEADER #define PROFILER_HEADER -#include "common_irrlicht.h" +#include "irrlichttypes.h" #include -#include "utility.h" -#include -#include +#include + +#include "jthread/jmutex.h" +#include "jthread/jmutexautolock.h" +#include "util/timetaker.h" +#include "util/numeric.h" // paging() +#include "debug.h" // assert() /* Time profiler @@ -35,7 +39,6 @@ class Profiler public: Profiler() { - m_mutex.Init(); } void add(const std::string &name, float value) @@ -43,21 +46,21 @@ public: JMutexAutoLock lock(m_mutex); { /* No average shall have been used; mark add used as -2 */ - core::map::Node *n = m_avgcounts.find(name); - if(n == NULL) + std::map::iterator n = m_avgcounts.find(name); + if(n == m_avgcounts.end()) m_avgcounts[name] = -2; else{ - if(n->getValue() == -1) - n->setValue(-2); - assert(n->getValue() == -2); + if(n->second == -1) + n->second = -2; + assert(n->second == -2); } } { - core::map::Node *n = m_data.find(name); - if(n == NULL) + std::map::iterator n = m_data.find(name); + if(n == m_data.end()) m_data[name] = value; else - n->setValue(n->getValue() + value); + n->second += value; } } @@ -65,52 +68,68 @@ public: { JMutexAutoLock lock(m_mutex); { - core::map::Node *n = m_avgcounts.find(name); - if(n == NULL) + std::map::iterator n = m_avgcounts.find(name); + if(n == m_avgcounts.end()) 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); + assert(n->second != -2); + n->second = MYMAX(n->second, 0) + 1; } } { - core::map::Node *n = m_data.find(name); - if(n == NULL) + std::map::iterator n = m_data.find(name); + if(n == m_data.end()) m_data[name] = value; else - n->setValue(n->getValue() + value); + n->second += value; } } void clear() { JMutexAutoLock lock(m_mutex); - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd() == false; i++) + for(std::map::iterator + i = m_data.begin(); + i != m_data.end(); ++i) { - i.getNode()->setValue(0); + i->second = 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 - i = m_data.getIterator(); - i.atEnd() == false; i++) + + u32 minindex, maxindex; + paging(m_data.size(), page, pagecount, minindex, maxindex); + + for(std::map::iterator + i = m_data.begin(); + i != m_data.end(); ++i) { - std::string name = i.getNode()->getKey(); + if(maxindex == 0) + break; + maxindex--; + + if(minindex != 0) + { + minindex--; + continue; + } + + std::string name = i->first; int avgcount = 1; - core::map::Node *n = m_avgcounts.find(name); - if(n){ - if(n->getValue() >= 1) - avgcount = n->getValue(); + std::map::iterator n = m_avgcounts.find(name); + if(n != m_avgcounts.end()){ + if(n->second >= 1) + avgcount = n->second; } o<<" "<getValue() / avgcount); + o<<(i->second / avgcount); o< GraphValues; + + void graphAdd(const std::string &id, float value) + { + JMutexAutoLock lock(m_mutex); + std::map::iterator i = + m_graphvalues.find(id); + if(i == m_graphvalues.end()) + m_graphvalues[id] = value; + else + i->second += value; + } + void graphGet(GraphValues &result) + { + JMutexAutoLock lock(m_mutex); + result = m_graphvalues; + m_graphvalues.clear(); + } + + void remove(const std::string& name) + { + JMutexAutoLock lock(m_mutex); + m_avgcounts.erase(name); + m_data.erase(name); + } + private: JMutex m_mutex; - core::map m_data; - core::map m_avgcounts; + std::map m_data; + std::map m_avgcounts; + std::map m_graphvalues; }; enum ScopeProfilerType{ SPT_ADD, - SPT_AVG + SPT_AVG, + SPT_GRAPH_ADD }; class ScopeProfiler @@ -176,6 +223,9 @@ public: case SPT_AVG: m_profiler->avg(m_name, duration); break; + case SPT_GRAPH_ADD: + m_profiler->graphAdd(m_name, duration); + break; } } delete m_timer;