summaryrefslogtreecommitdiff
path: root/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'source/core')
-rw-r--r--source/core/slang-performance-profiler.cpp75
-rw-r--r--source/core/slang-performance-profiler.h31
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__)
}