This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

122 lines
3.5 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $Workfile: $
// $Date: $
// $NoKeywords: $
//=============================================================================//
#if !defined(MEASURE_SECTION_H)
#define MEASURE_SECTION_H
#ifdef _WIN32
#pragma once
#endif
#include "convar.h"
#include "tier0/fasttimer.h"
// This is the macro to use in your code to measure until the code goes
// out of scope
#if defined(_DEBUG) || defined(FORCE_MEASURE)
#define MEASURECODE(description) \
static CMeasureSection _xxx_ms(description); \
CMeasureSectionInstance _xxx_ms_inst(&_xxx_ms);
#else
#define MEASURECODE(description)
#endif
// ------------------------------------------------------------------------------------
// // These things must exist in the executable for the CMeasureSection code to
// work.
// ------------------------------------------------------------------------------------
// //
float GetRealTime(); // Get the clock's time.
extern ConVar game_speeds;
extern ConVar measure_resort;
// ------------------------------------------------------------------------------------
// //
// Called once per frame to allow any necessary measurements to latch
void ResetTimeMeasurements(void);
//-----------------------------------------------------------------------------
// Purpose: Accumulates time for the named section
//-----------------------------------------------------------------------------
class CMeasureSection {
public:
// Allows for measuring named section
CMeasureSection(const char *name);
virtual ~CMeasureSection(void);
// Update max value hit
void UpdateMax(void);
// Reset totals
void Reset(void);
// Reset sortable totals
void SortReset(void);
// Get static name of section
const char *GetName(void);
// Get accumulated time
CCycleCount const &GetTotalTime(void);
CCycleCount const &GetTime();
CCycleCount const &GetMaxTime();
// Add in some time
void AddTime(CCycleCount const &rCount);
// Get next section in chain
CMeasureSection *GetNext(void);
// Get head of list of all sections
static CMeasureSection *GetList(void);
// Sort all sections by most time consuming
static void SortSections(void);
public:
// Time when list should be sorted again
static double m_dNextResort;
private:
// Accumulated time for section
CCycleCount m_dAccumulatedTime;
// Max time for section
CCycleCount m_dMaxTime;
// Elapsed time for section
CCycleCount m_dTotalTime;
// Name of section
const char *m_pszName;
// Next section in chain
CMeasureSection *m_pNext;
// Head of section list
static CMeasureSection *s_pSections;
// Quick total for doing sorts faster
static int s_nCount;
};
//-----------------------------------------------------------------------------
// Purpose: On construction marks time and on destruction adds time to
// parent CMeasureSection object
//-----------------------------------------------------------------------------
class CMeasureSectionInstance {
public:
// Constructor: Points to object to accumulate time into
CMeasureSectionInstance(CMeasureSection *ms);
// Destructor: Latches accumulated time
virtual ~CMeasureSectionInstance(void);
private:
// Time of construction
CFastTimer m_Timer;
// Where to place elapsed time
CMeasureSection *m_pMS;
};
#endif // MEASURE_SECTION_H