diff options
Diffstat (limited to 'source/core')
| -rw-r--r-- | source/core/slang-performance-profiler.cpp | 75 | ||||
| -rw-r--r-- | source/core/slang-performance-profiler.h | 31 |
2 files changed, 100 insertions, 6 deletions
diff --git a/source/core/slang-performance-profiler.cpp b/source/core/slang-performance-profiler.cpp index 7ca33f615..f8e934491 100644 --- a/source/core/slang-performance-profiler.cpp +++ b/source/core/slang-performance-profiler.cpp @@ -3,11 +3,6 @@ namespace Slang { - struct FuncProfileInfo - { - int invocationCount = 0; - std::chrono::nanoseconds duration = std::chrono::nanoseconds::zero(); - }; class PerformanceProfilerImpl : public PerformanceProfiler { public: @@ -39,9 +34,14 @@ namespace Slang for (auto func : data) { out << func.key << ": \t"; - out << func.value.invocationCount << "\t" << func.value.duration.count() / 1000000.0f << "\n"; + auto milliseconds = std::chrono::duration_cast< std::chrono::milliseconds >(func.value.duration); + out << func.value.invocationCount << "\t" << milliseconds.count() << "ms\n"; } } + virtual void clear() override + { + data.clear(); + } }; PerformanceProfiler* Slang::PerformanceProfiler::getProfiler() @@ -49,4 +49,67 @@ namespace Slang thread_local static PerformanceProfilerImpl profiler = PerformanceProfilerImpl(); return &profiler; } + + SlangProfiler::SlangProfiler(PerformanceProfiler* profiler) + { + PerformanceProfilerImpl* profilerImpl = static_cast<PerformanceProfilerImpl*>(profiler); + size_t entryCount = profilerImpl->data.getCount(); + + m_profilEntries.reserve(entryCount); + + int index = 0; + for (auto func : profilerImpl->data) + { + ProfileInfo profileEntry {}; + size_t strSize = std::min(sizeof(profileEntry.funcName) - 1, strlen(func.key)); + + if (strSize > 0) + { + strncpy_s(profileEntry.funcName, strSize, func.key, strSize); + } + profileEntry.invocationCount = func.value.invocationCount; + profileEntry.duration = func.value.duration; + + m_profilEntries.insert(index, profileEntry); + index++; + } + } + + ISlangUnknown* SlangProfiler::getInterface(const Guid& guid) + { + if(guid == SlangProfiler::getTypeGuid()) + return static_cast<ISlangUnknown*>(this); + else + return nullptr; + } + + size_t SlangProfiler::getEntryCount() + { + return m_profilEntries.getCount(); + } + + const char* SlangProfiler::getEntryName(uint32_t index) + { + if (index >= (uint32_t)m_profilEntries.getCount()) + return nullptr; + + return m_profilEntries[index].funcName; + } + + long SlangProfiler::getEntryTimeMS(uint32_t index) + { + if (index >= (uint32_t)m_profilEntries.getCount()) + return 0; + + auto milliseconds = std::chrono::duration_cast< std::chrono::milliseconds >(m_profilEntries[index].duration); + return (long)milliseconds.count(); + } + + uint32_t SlangProfiler::getEntryInvocationTimes(uint32_t index) + { + if (index >= (uint32_t)m_profilEntries.getCount()) + return 0; + + return m_profilEntries[index].invocationCount; + } } diff --git a/source/core/slang-performance-profiler.h b/source/core/slang-performance-profiler.h index 323940ade..f7c62bb45 100644 --- a/source/core/slang-performance-profiler.h +++ b/source/core/slang-performance-profiler.h @@ -3,10 +3,19 @@ #include "slang-string.h" #include <chrono> +#include <vector> +#include "../../slang-com-helper.h" +#include "../core/slang-list.h" namespace Slang { +struct FuncProfileInfo +{ + int invocationCount = 0; + std::chrono::nanoseconds duration = std::chrono::nanoseconds::zero(); +}; + struct FuncProfileContext { const char* funcName = nullptr; @@ -19,6 +28,7 @@ public: virtual FuncProfileContext enterFunction(const char* funcName) = 0; virtual void exitFunction(FuncProfileContext context) = 0; virtual void getResult(StringBuilder& out) = 0; + virtual void clear() = 0; public: static PerformanceProfiler* getProfiler(); }; @@ -36,6 +46,27 @@ struct PerformanceProfilerFuncRAIIContext } }; +struct SlangProfiler: public ISlangProfiler, public RefObject +{ +public: + SLANG_REF_OBJECT_IUNKNOWN_ALL + struct ProfileInfo + { + char funcName[256] = {0}; + int invocationCount = 0; + std::chrono::nanoseconds duration = std::chrono::nanoseconds::zero(); + }; + SlangProfiler(PerformanceProfiler * profiler); + ISlangUnknown* getInterface(const Guid& guid); + + virtual SLANG_NO_THROW size_t SLANG_MCALL getEntryCount() override; + virtual SLANG_NO_THROW const char* SLANG_MCALL getEntryName(uint32_t index) override; + virtual SLANG_NO_THROW long SLANG_MCALL getEntryTimeMS(uint32_t index) override; + virtual SLANG_NO_THROW uint32_t SLANG_MCALL getEntryInvocationTimes(uint32_t index) override; +private: + List<ProfileInfo> m_profilEntries; +}; + #define SLANG_PROFILE PerformanceProfilerFuncRAIIContext _profileContext(__func__) } |
