class Foo
#ifdef TRACK_OBJECT_USAGE
: public InstanceCounter<Foo>
#endif
Then, use this macro somewhere in the class body:
SUPPORT_OBJECT_ANALYTICS(Foo)
Lastly, add whatever information you want to trace out to the function ObjectAnalytics::DumpStatistics().
Here's a sample of the output of what I've instrumented so far:
-----------------------------------------------------------
Object Usage Stats
CardPrimitive current count: 7899
CardPrimitive current byte usage: 2053740
CardPrimitive max count: 7908
CardPrimitive max byte usage: 2056080
MTGCard current count: 13973
MTGCard current byte usage: 670704
MTGCard max count: 13982
MTGCard max byte usage: 671136
MTGCardInstance current count: 180
MTGCardInstance current byte usage: 172080
MTGCardInstance max count: 189
MTGCardInstance max byte usage: 180684
-----------------------------------------------------------
88 lines
1.8 KiB
C++
88 lines
1.8 KiB
C++
#ifndef OBJECTANALYTICS_H
|
|
#define OBJECTANALYTICS_H
|
|
|
|
#ifdef DEBUG
|
|
#define TRACK_OBJECT_USAGE
|
|
#endif
|
|
|
|
#ifdef TRACK_OBJECT_USAGE
|
|
|
|
namespace ObjectAnalytics
|
|
{
|
|
/*
|
|
** See ObjectAnalytics.cpp for how to add additional objects to this function's dump
|
|
*/
|
|
void DumpStatistics();
|
|
}
|
|
|
|
#define SUPPORT_OBJECT_ANALYTICS(classname) \
|
|
template <> unsigned int InstanceCounter<classname>::sHighWaterMark = 0; \
|
|
template <> unsigned int InstanceCounter<classname>::sInstanceCount = 0; \
|
|
|
|
|
|
/**
|
|
** Helper class for tracking object instances.
|
|
** Usage:
|
|
** class Foo
|
|
** #ifdef TRACK_OBJECT_USAGE
|
|
** : public InstanceCounter<Foo>
|
|
** #endif
|
|
**
|
|
** Additionally, since the implementation uses static counters,
|
|
** somewhere in your class body, you need to put in the following macro:
|
|
** SUPPORT_OBJECT_ANALYTICS(Foo);
|
|
*/
|
|
template <typename T>
|
|
class InstanceCounter
|
|
{
|
|
public:
|
|
InstanceCounter()
|
|
{
|
|
if (sHighWaterMark < ++sInstanceCount)
|
|
sHighWaterMark = sInstanceCount;
|
|
}
|
|
|
|
InstanceCounter(const InstanceCounter&)
|
|
{
|
|
if (sHighWaterMark < ++sInstanceCount)
|
|
sHighWaterMark = sInstanceCount;
|
|
}
|
|
InstanceCounter& operator =(const InstanceCounter&)
|
|
{
|
|
}
|
|
|
|
~InstanceCounter()
|
|
{
|
|
--sInstanceCount;
|
|
}
|
|
|
|
static unsigned int GetCurrentObjectCount()
|
|
{
|
|
return sInstanceCount;
|
|
}
|
|
|
|
static unsigned int GetMaximumObjectCount()
|
|
{
|
|
return sHighWaterMark;
|
|
}
|
|
|
|
static unsigned int GetCurrentByteCount()
|
|
{
|
|
return sizeof(T) * sInstanceCount;
|
|
}
|
|
|
|
static unsigned int GetMaximumByteCount()
|
|
{
|
|
return sizeof(T) * sHighWaterMark;
|
|
}
|
|
|
|
static unsigned int sInstanceCount;
|
|
static unsigned int sHighWaterMark;
|
|
};
|
|
|
|
#else
|
|
#define SUPPORT_OBJECT_ANALYTICS(classname)
|
|
#endif //TRACK_OBJECT_USAGE
|
|
|
|
#endif //OBJECTANALYTICS_H
|