From 267c9f4cb4616afcf07a2a33aaca43a903ac895a Mon Sep 17 00:00:00 2001 From: gregorycu Date: Thu, 22 Jan 2015 00:25:06 +1100 Subject: [PATCH] Optimize Profiler::avg() --- src/profiler.h | 37 ++++++++++++++++++++----------------- src/test.cpp | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/profiler.h b/src/profiler.h index 5816f05ca..e5bb760c6 100644 --- a/src/profiler.h +++ b/src/profiler.h @@ -69,23 +69,11 @@ public: void avg(const std::string &name, float value) { JMutexAutoLock lock(m_mutex); - { - 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->second != -2); - n->second = MYMAX(n->second, 0) + 1; - } - } - { - std::map::iterator n = m_data.find(name); - if(n == m_data.end()) - m_data[name] = value; - else - n->second += value; - } + int &count = m_avgcounts[name]; + + assert(count != -2); + count = MYMAX(count, 0) + 1; + m_data[name] += value; } void clear() @@ -105,6 +93,21 @@ public: 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); diff --git a/src/test.cpp b/src/test.cpp index 7b82a2c31..8c9f26c52 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -43,6 +43,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "noise.h" // PseudoRandom used for random data for compression #include "network/networkprotocol.h" // LATEST_PROTOCOL_VERSION +#include "profiler.h" #include /* @@ -2118,6 +2119,40 @@ struct TestConnection: public TestBase } }; +struct TestProfiler : public TestBase +{ + void Run() + { + Profiler p; + + p.avg("Test1", 1.f); + UASSERT(p.getValue("Test1") == 1.f); + + p.avg("Test1", 2.f); + UASSERT(p.getValue("Test1") == 1.5f); + + p.avg("Test1", 3.f); + UASSERT(p.getValue("Test1") == 2.f); + + p.avg("Test1", 486.f); + UASSERT(p.getValue("Test1") == 123.f); + + p.avg("Test1", 8); + UASSERT(p.getValue("Test1") == 100.f); + + p.avg("Test1", 700); + UASSERT(p.getValue("Test1") == 200.f); + + p.avg("Test1", 10000); + UASSERT(p.getValue("Test1") == 1600.f); + + p.avg("Test2", 123.56); + p.avg("Test2", 123.58); + + UASSERT(p.getValue("Test2") == 123.57f); + } +}; + #define TEST(X) do {\ X x;\ infostream<<"Running " #X <