X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fprofiler.h;h=b4a0657f980f154aabbca6e83aaa4fb73e000344;hb=e3bd6704a0eb65e9490347680441c7a08df36f7a;hp=a30e34a7c77dd06558d7efa40bf755d61f0b043f;hpb=223b3793485a76f87599d39364b1003c2ca7c49c;p=minetest.git diff --git a/src/profiler.h b/src/profiler.h index a30e34a7c..b4a0657f9 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -1,30 +1,37 @@ /* -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. */ -#ifndef PROFILER_HEADER -#define PROFILER_HEADER +#pragma once -#include "common_irrlicht.h" +#include "irrlichttypes.h" +#include #include -#include "utility.h" -#include -#include +#include +#include + +#include "threading/mutex_auto_lock.h" +#include "util/timetaker.h" +#include "util/numeric.h" // paging() + +// Global profiler +class Profiler; +extern Profiler *g_profiler; /* Time profiler @@ -33,99 +40,70 @@ with this program; if not, write to the Free Software Foundation, Inc., class Profiler { public: - Profiler() - { - m_mutex.Init(); - } + Profiler(); + + void add(const std::string &name, float value); + void avg(const std::string &name, float value); + void clear(); - void add(const std::string &name, u32 duration) + float getValue(const std::string &name) const; + int getAvgCount(const std::string &name) const; + u64 getElapsedMs() const; + + typedef std::map GraphValues; + + // Returns the line count + int print(std::ostream &o, u32 page = 1, u32 pagecount = 1); + void getPage(GraphValues &o, u32 page, u32 pagecount); + + + void graphAdd(const std::string &id, float value) { - JMutexAutoLock lock(m_mutex); - core::map::Node *n = m_data.find(name); - if(n == NULL) - { - m_data[name] = duration; - } + MutexAutoLock lock(m_mutex); + std::map::iterator i = + m_graphvalues.find(id); + if(i == m_graphvalues.end()) + m_graphvalues[id] = value; else - { - n->setValue(n->getValue()+duration); - } + i->second += value; } - - void clear() + void graphGet(GraphValues &result) { - JMutexAutoLock lock(m_mutex); - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd() == false; i++) - { - i.getNode()->setValue(0); - } + MutexAutoLock lock(m_mutex); + result = m_graphvalues; + m_graphvalues.clear(); } - void print(std::ostream &o) + void remove(const std::string& name) { - JMutexAutoLock lock(m_mutex); - for(core::map::Iterator - i = m_data.getIterator(); - i.atEnd() == false; i++) - { - std::string name = i.getNode()->getKey(); - o<getValue(); - o< m_data; + std::mutex m_mutex; + std::map m_data; + std::map m_avgcounts; + std::map m_graphvalues; + u64 m_start_time; +}; + +enum ScopeProfilerType{ + SPT_ADD, + SPT_AVG, + SPT_GRAPH_ADD }; class ScopeProfiler { public: - ScopeProfiler(Profiler *profiler, const std::string &name): - m_profiler(profiler), - m_name(name), - m_timer(NULL) - { - if(m_profiler) - m_timer = new TimeTaker(m_name.c_str()); - } - // name is copied - ScopeProfiler(Profiler *profiler, const char *name): - m_profiler(profiler), - m_name(name), - m_timer(NULL) - { - if(m_profiler) - m_timer = new TimeTaker(m_name.c_str()); - } - ~ScopeProfiler() - { - if(m_timer) - { - u32 duration = m_timer->stop(true); - if(m_profiler) - m_profiler->add(m_name, duration); - delete m_timer; - } - } + ScopeProfiler(Profiler *profiler, const std::string &name, + 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 -