X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fprofiler.h;h=b4a0657f980f154aabbca6e83aaa4fb73e000344;hb=393c8392821bf3357d2ada3ac0afe065758acc53;hp=b1e6abe5883312a1ceac1e06db2970b1876eb893;hpb=9f031a67594162a53b07acbfbc65faf8c4938e99;p=dragonfireclient.git diff --git a/src/profiler.h b/src/profiler.h index b1e6abe58..b4a0657f9 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -1,6 +1,6 @@ /* -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 Lesser General Public License as published by @@ -17,16 +17,21 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef PROFILER_HEADER -#define PROFILER_HEADER +#pragma once -#include "irrlichttypes_bloated.h" +#include "irrlichttypes.h" +#include #include -#include -#include #include +#include + +#include "threading/mutex_auto_lock.h" #include "util/timetaker.h" -#include "util/numeric.h" // paging() +#include "util/numeric.h" // paging() + +// Global profiler +class Profiler; +extern Profiler *g_profiler; /* Time profiler @@ -35,124 +40,26 @@ with this program; if not, write to the Free Software Foundation, Inc., class Profiler { public: - Profiler() - { - m_mutex.Init(); - } - - void add(const std::string &name, float value) - { - 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) - 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); - } - } + Profiler(); - 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); - } - } + void add(const std::string &name, float value); + void avg(const std::string &name, float value); + void clear(); - void clear() - { - JMutexAutoLock lock(m_mutex); - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd() == false; i++) - { - i.getNode()->setValue(0); - } - m_avgcounts.clear(); - } + float getValue(const std::string &name) const; + int getAvgCount(const std::string &name) const; + u64 getElapsedMs() const; - void print(std::ostream &o) - { - printPage(o, 1, 1); - } + typedef std::map GraphValues; - void printPage(std::ostream &o, u32 page, u32 pagecount) - { - JMutexAutoLock lock(m_mutex); - - 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(); - int avgcount = 1; - core::map::Node *n = m_avgcounts.find(name); - if(n){ - if(n->getValue() >= 1) - avgcount = n->getValue(); - } - o<<" "<getValue() / avgcount); - o< GraphValues; void graphAdd(const std::string &id, float value) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); std::map::iterator i = m_graphvalues.find(id); if(i == m_graphvalues.end()) @@ -162,16 +69,24 @@ class Profiler } void graphGet(GraphValues &result) { - JMutexAutoLock lock(m_mutex); + MutexAutoLock lock(m_mutex); result = m_graphvalues; m_graphvalues.clear(); } + void remove(const std::string& name) + { + MutexAutoLock lock(m_mutex); + m_avgcounts.erase(name); + m_data.erase(name); + } + private: - JMutex m_mutex; - core::map m_data; - core::map m_avgcounts; + std::mutex m_mutex; + std::map m_data; + std::map m_avgcounts; std::map m_graphvalues; + u64 m_start_time; }; enum ScopeProfilerType{ @@ -184,54 +99,11 @@ class ScopeProfiler { public: ScopeProfiler(Profiler *profiler, const std::string &name, - enum ScopeProfilerType type = SPT_ADD): - m_profiler(profiler), - m_name(name), - 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, - enum ScopeProfilerType type = SPT_ADD): - m_profiler(profiler), - m_name(name), - m_timer(NULL), - m_type(type) - { - if(m_profiler) - m_timer = new TimeTaker(m_name.c_str()); - } - ~ScopeProfiler() - { - if(m_timer) - { - 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; - case SPT_GRAPH_ADD: - m_profiler->graphAdd(m_name, duration); - break; - } - } - delete m_timer; - } - } + ScopeProfilerType type = SPT_ADD); + ~ScopeProfiler(); private: - Profiler *m_profiler; + Profiler *m_profiler = nullptr; std::string m_name; - TimeTaker *m_timer; + TimeTaker *m_timer = nullptr; enum ScopeProfilerType m_type; }; - -#endif -