Extended profilethinkers CVAR with sorting ability

Sorting modes are
1 - by name, from A to Z
2 - by name, from Z to A
3 - number of calls, ascending
4 - number of calls, descending
5 - total time, ascending
anything else - total time, descending
This commit is contained in:
alexey.lysiuk 2018-03-09 18:13:16 +02:00
parent d8e43dffbb
commit fc981bf5d4

View file

@ -462,7 +462,7 @@ void DThinker::DestroyThinkersInList (FThinkerList &list)
//
//
//==========================================================================
CVAR(Bool, profilethinkers, false, 0)
CVAR(Int, profilethinkers, 0, 0)
struct ProfileInfo
{
@ -526,12 +526,48 @@ void DThinker::RunThinkers ()
count += ProfileThinkers(&FreshThinkers[i], &Thinkers[i]);
}
} while (count != 0);
struct SortedProfileInfo
{
const char* className;
int numcalls;
double time;
};
TArray<SortedProfileInfo> sorted;
sorted.Grow(Profiles.CountUsed());
auto it = TMap<FName, ProfileInfo>::Iterator(Profiles);
TMap<FName, ProfileInfo>::Pair *pair;
while (it.NextPair(pair))
{
Printf("%s, %dx, %fms\n", pair->Key.GetChars(), pair->Value.numcalls, pair->Value.timer.TimeMS());
sorted.Push({ pair->Key.GetChars(), pair->Value.numcalls, pair->Value.timer.TimeMS() });
}
std::sort(sorted.begin(), sorted.end(), [](const SortedProfileInfo& left, const SortedProfileInfo& right)
{
switch (profilethinkers)
{
case 1: // by name, from A to Z
return stricmp(left.className, right.className) < 0;
case 2: // by name, from Z to A
return stricmp(right.className, left.className) < 0;
case 3: // number of calls, ascending
return left.numcalls < right.numcalls;
case 4: // number of calls, descending
return right.numcalls < left.numcalls;
case 5: // total time, ascending
return left.time < right.time;
default: // total time, descending
return right.time < left.time;
}
});
for (const SortedProfileInfo& info : sorted)
{
Printf("%s, %dx, %fms\n", info.className, info.numcalls, info.time);
}
profilethinkers = false;
}