blob: f5f74f99d6f8e796bc124fd705f638d4577df1ab (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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;
}
}
|