From 32b9e2070b3cf44b6b38ab0c0383b85e87852d50 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Fri, 7 Sep 2018 20:58:59 +0300 Subject: Add basic performance counters. Add in debug window new tab with this counters. --- src/utils/perfstat.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ src/utils/perfstat.h | 62 ++++++++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 src/utils/perfstat.cpp create mode 100644 src/utils/perfstat.h (limited to 'src/utils') diff --git a/src/utils/perfstat.cpp b/src/utils/perfstat.cpp new file mode 100644 index 000000000..839fc7291 --- /dev/null +++ b/src/utils/perfstat.cpp @@ -0,0 +1,127 @@ +/* + * The ManaPlus Client + * Copyright (C) 2018 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "utils/perfstat.h" + +#include "logger.h" + +#include "utils/timer.h" + +#include "debug.h" + +PerfStats perfStats[PERFSTAT_MAX]; + +size_t perfFrameId = 0; +size_t prevPerfFrameId = PERFSTAT_MAX; +int *perfFrame = &perfStats[perfFrameId].ticks[0]; +PerfStats worstFrameStats; +int worstTime = -1; +int skipPerfFrames = -1; + +namespace Perf +{ + void init() + { + logger->log("perf stats init"); + worstTime = -1; + perfFrameId = 0; + prevPerfFrameId = 0; + for (size_t f = 0; f < PERFSTAT_LAST_STAT; f ++) + { + worstFrameStats.ticks[f] = 0; + } + for (size_t f = 0; f < PERFSTAT_MAX; f ++) + { + PerfStats &perf = perfStats[f]; + for (size_t d = 0; d < PERFSTAT_LAST_STAT; d ++) + { + perf.ticks[d] = 0; + } + } + skipPerfFrames = 0; + } + + void nextFrame() + { + if (skipPerfFrames > 0) + { + skipPerfFrames --; +// logger->log("skip frames: %d", skipPerfFrames); + return; + } + else if (skipPerfFrames < 0) + { + return; + } + prevPerfFrameId = perfFrameId; + perfFrameId ++; + if (perfFrameId >= PERFSTAT_MAX) + { + perfFrameId = 0; + selectWorstFrame(); + } + perfFrame = &perfStats[perfFrameId].ticks[0]; + } + + void selectWorstFrame() + { + int time = worstTime; + int index = -1; + for (size_t f = 0; f < PERFSTAT_MAX; f ++) + { + if (f == perfFrameId) + continue; + const int time1 = Perf::getTime(f, PERFSTAT_LAST_STAT - 1); + if (time1 > time) + { + time = time1; + index = f; + } + } + if (index >= 0) + { + worstFrameStats = perfStats[index]; + logger->log("worst frame: %d, %d", + perfStats[index].ticks[PERFSTAT_LAST_STAT - 1], + worstFrameStats.ticks[PERFSTAT_LAST_STAT - 1]); + worstTime = time; + } + } + + int getTime(const size_t frameId, + const size_t counterId) + { + const PerfStats &perf = perfStats[frameId]; + const int val1 = perf.ticks[0]; + const int val2 = perf.ticks[counterId]; + if (val2 >= val1) + return val2 - val1; + return val1 - val1; + } + + int getWorstTime(const size_t counterId) + { + const int val1 = worstFrameStats.ticks[0]; + const int val2 = worstFrameStats.ticks[counterId]; + if (val2 >= val1) + return val2 - val1; + return val1 - val1; + } +} diff --git a/src/utils/perfstat.h b/src/utils/perfstat.h new file mode 100644 index 000000000..97e5e1a07 --- /dev/null +++ b/src/utils/perfstat.h @@ -0,0 +1,62 @@ +/* + * The ManaPlus Client + * Copyright (C) 2018 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef UTILS_PERFSTAT_H +#define UTILS_PERFSTAT_H + +#include "const/utils/perfstat.h" + +#include "localconsts.h" + +struct PerfStats +{ + PerfStats() + { + for (int f = 0; f < 16; f ++) + ticks[f] = -1; + } + + int ticks[16]; +}; + +namespace Perf +{ + void init(); + void nextFrame(); + void selectWorstFrame(); + int getTime(const size_t frameId, + const size_t counterId); + int getWorstTime(const size_t counterId); +} + +extern PerfStats perfStats[PERFSTAT_MAX]; +extern size_t perfFrameId; +extern size_t prevPerfFrameId; +extern int *perfFrame; +extern PerfStats worstFrameStats; +extern int skipPerfFrames; + +#define PERF_STAT(n) \ + perfFrame[n] = tick_time + +#define PERF_NEXTFRAME() \ + Perf::nextFrame() + +#endif // UTILS_PERFSTAT_H -- cgit v1.2.3-60-g2f50