summaryrefslogtreecommitdiffstats
path: root/source/core/slang-performance-profiler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/slang-performance-profiler.cpp')
-rw-r--r--source/core/slang-performance-profiler.cpp75
1 files changed, 69 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;
+ }
}