You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.0 KiB
91 lines
2.0 KiB
#pragma once
|
|
|
|
#ifdef _WIN32
|
|
#include "windows.h"
|
|
#include "psapi.h"
|
|
#else
|
|
#endif
|
|
|
|
|
|
float mb_in_use()
|
|
{
|
|
float mem = 0;
|
|
#ifdef _WIN32
|
|
PROCESS_MEMORY_COUNTERS_EX pmc;
|
|
GetProcessMemoryInfo( GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS *)&pmc, sizeof( pmc ) );
|
|
|
|
mem = float( pmc.WorkingSetSize / (1024. * 1024.) );
|
|
#else
|
|
#endif
|
|
return mem;
|
|
}
|
|
class memory_profiler
|
|
{
|
|
float _baseline;
|
|
std::atomic< float > _peak{ 0 };
|
|
std::atomic_bool _alive{ true };
|
|
|
|
std::thread _th;
|
|
|
|
// section
|
|
float _s_start = 0.f;
|
|
std::atomic< float > _s_peak;
|
|
|
|
public:
|
|
memory_profiler()
|
|
: _baseline( mb_in_use() )
|
|
{
|
|
_th = std::thread( [&]() {
|
|
while( _alive )
|
|
{
|
|
auto const mb = mb_in_use();
|
|
_peak = std::max( mb, (float)_peak );
|
|
_s_peak = std::max( mb, (float)_s_peak );
|
|
std::this_thread::sleep_for( std::chrono::milliseconds( 10 ) );
|
|
}
|
|
} );
|
|
}
|
|
|
|
void section( char const * heading )
|
|
{
|
|
_s_start = mb_in_use();
|
|
_s_peak = _s_start;
|
|
TRACE( "\n\n-P------------ " << heading << ":" );
|
|
}
|
|
|
|
void section_end()
|
|
{
|
|
auto const mb = mb_in_use();
|
|
_s_peak = std::max( mb, (float)_s_peak );
|
|
TRACE( "-P------------ " << _s_start << " --> " << mb << " / " << _s_peak
|
|
<< " MB delta " << (mb - _s_start) << " / "
|
|
<< (_s_peak - _s_start) << " peak\n" );
|
|
}
|
|
|
|
~memory_profiler()
|
|
{
|
|
stop();
|
|
|
|
auto const mb = mb_in_use();
|
|
TRACE( "\n-P------------ FINAL: " << mb << " / " << _peak << " peak (" << _baseline
|
|
<< " baseline)" );
|
|
}
|
|
|
|
void snapshot( char const * desc )
|
|
{
|
|
TRACE( "-P------------ " << desc << ": " << mb_in_use() << " / " << (float)_peak << " peak" );
|
|
}
|
|
|
|
void stop()
|
|
{
|
|
if( _alive )
|
|
{
|
|
_alive = false;
|
|
_th.join();
|
|
}
|
|
}
|
|
|
|
float get_peak() const { return _peak; }
|
|
float get_baseline() const { return _baseline; }
|
|
};
|