X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fprofiler.h;h=78d3b08e06493052362b3d443d946e72d7832a23;hb=35cc90b0865469a10dd43786b07f4e39503a2663;hp=f887584d19f170b15c4c1bfc559e1ed737fd45e4;hpb=da4f51332ffff502d7b7f6976287963959cdb11d;p=minetest.git diff --git a/src/profiler.h b/src/profiler.h index f887584d1..78d3b08e0 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,13 +20,22 @@ 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() + +#define MAX_PROFILER_TEXT_ROWS 20 + +// Global profiler +class Profiler; +extern Profiler *g_profiler; + /* Time profiler */ @@ -36,7 +45,6 @@ class Profiler public: Profiler() { - m_mutex.Init(); } void add(const std::string &name, float value) @@ -44,57 +52,42 @@ class Profiler 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; } } 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); - } - } - { - core::map::Node *n = m_data.find(name); - if(n == NULL) - m_data[name] = value; - else - n->setValue(n->getValue() + value); - } + int &count = m_avgcounts[name]; + + assert(count != -2); + count = MYMAX(count, 0) + 1; + m_data[name] += 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(); } @@ -104,6 +97,21 @@ class Profiler printPage(o, 1, 1); } + float getValue(const std::string &name) const + { + std::map::const_iterator numerator = m_data.find(name); + if (numerator == m_data.end()) + return 0.f; + + std::map::const_iterator denominator = m_avgcounts.find(name); + if (denominator != m_avgcounts.end()){ + if (denominator->second >= 1) + return numerator->second / denominator->second; + } + + return numerator->second; + } + void printPage(std::ostream &o, u32 page, u32 pagecount) { JMutexAutoLock lock(m_mutex); @@ -111,9 +119,9 @@ class Profiler u32 minindex, maxindex; paging(m_data.size(), page, pagecount, minindex, maxindex); - 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) { if(maxindex == 0) break; @@ -125,12 +133,12 @@ class Profiler continue; } - std::string name = i.getNode()->getKey(); + 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< m_data; - core::map m_avgcounts; + std::map m_data; + std::map m_avgcounts; std::map m_graphvalues; };