diff options
Diffstat (limited to 'source/core')
| -rw-r--r-- | source/core/slang-performance-profiler.cpp | 52 | ||||
| -rw-r--r-- | source/core/slang-performance-profiler.h | 42 |
2 files changed, 94 insertions, 0 deletions
diff --git a/source/core/slang-performance-profiler.cpp b/source/core/slang-performance-profiler.cpp new file mode 100644 index 000000000..f5f74f99d --- /dev/null +++ b/source/core/slang-performance-profiler.cpp @@ -0,0 +1,52 @@ +#include "slang-performance-profiler.h" +#include "slang-dictionary.h" + +namespace Slang +{ + struct FuncProfileInfo + { + int invocationCount = 0; + std::chrono::nanoseconds duration = std::chrono::nanoseconds::zero(); + }; + class PerformanceProfilerImpl : public PerformanceProfiler + { + public: + OrderedDictionary<const char*, FuncProfileInfo> data; + + virtual FuncProfileContext enterFunction(const char* funcName) override + { + auto entry = data.tryGetValue(funcName); + if (!entry) + { + data.add(funcName, FuncProfileInfo()); + entry = data.tryGetValue(funcName); + } + entry->invocationCount++; + FuncProfileContext ctx; + ctx.funcName = funcName; + ctx.startTime = std::chrono::high_resolution_clock::now(); + return ctx; + } + virtual void exitFunction(FuncProfileContext ctx) override + { + auto endTime = std::chrono::high_resolution_clock::now(); + auto duration = endTime - ctx.startTime; + auto entry = data.tryGetValue(ctx.funcName); + entry->duration += duration; + } + virtual void getResult(StringBuilder& out) override + { + for (auto func : data) + { + out << func.key << ": \t"; + out << func.value.invocationCount << "\t" << func.value.duration.count()/1000000 << "\n"; + } + } + }; + + PerformanceProfiler* Slang::PerformanceProfiler::getProfiler() + { + static PerformanceProfilerImpl profiler = PerformanceProfilerImpl(); + return &profiler; + } +} diff --git a/source/core/slang-performance-profiler.h b/source/core/slang-performance-profiler.h new file mode 100644 index 000000000..323940ade --- /dev/null +++ b/source/core/slang-performance-profiler.h @@ -0,0 +1,42 @@ +#ifndef SLANG_CORE_PERFORMANCE_PROFILER_H +#define SLANG_CORE_PERFORMANCE_PROFILER_H + +#include "slang-string.h" +#include <chrono> + +namespace Slang +{ + +struct FuncProfileContext +{ + const char* funcName = nullptr; + std::chrono::time_point<std::chrono::high_resolution_clock> startTime; +}; + +class PerformanceProfiler +{ +public: + virtual FuncProfileContext enterFunction(const char* funcName) = 0; + virtual void exitFunction(FuncProfileContext context) = 0; + virtual void getResult(StringBuilder& out) = 0; +public: + static PerformanceProfiler* getProfiler(); +}; + +struct PerformanceProfilerFuncRAIIContext +{ + FuncProfileContext context; + PerformanceProfilerFuncRAIIContext(const char* funcName) + { + context = PerformanceProfiler::getProfiler()->enterFunction(funcName); + } + ~PerformanceProfilerFuncRAIIContext() + { + PerformanceProfiler::getProfiler()->exitFunction(context); + } +}; + +#define SLANG_PROFILE PerformanceProfilerFuncRAIIContext _profileContext(__func__) +} + +#endif |
