[PATCH] D60404: Improve hashing for time profiler
Anton Afanasyev via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 8 05:58:22 PDT 2019
anton-afanasyev created this revision.
anton-afanasyev added reviewers: rnk, takuto.ikuta.
Herald added subscribers: llvm-commits, hiraditya.
Herald added a project: LLVM.
Use optimized hashing while writing time trace by join two hashes to one.
Used for -ftime-trace option.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D60404
Files:
llvm/lib/Support/TimeProfiler.cpp
Index: llvm/lib/Support/TimeProfiler.cpp
===================================================================
--- llvm/lib/Support/TimeProfiler.cpp
+++ llvm/lib/Support/TimeProfiler.cpp
@@ -51,7 +51,8 @@
}
typedef duration<steady_clock::rep, steady_clock::period> DurationType;
-typedef std::pair<std::string, DurationType> NameAndDuration;
+typedef std::pair<size_t, DurationType> CountAndDurationType;
+typedef std::pair<std::string, CountAndDurationType> NameAndCountAndDurationType;
struct Entry {
time_point<steady_clock> Start;
@@ -89,8 +90,9 @@
if (std::find_if(++Stack.rbegin(), Stack.rend(), [&](const Entry &Val) {
return Val.Name == E.Name;
}) == Stack.rend()) {
- TotalPerName[E.Name] += E.Duration;
- CountPerName[E.Name]++;
+ auto& CountAndTotal = CountAndTotalPerName[E.Name];
+ CountAndTotal.first++;
+ CountAndTotal.second += E.Duration;
}
Stack.pop_back();
@@ -115,23 +117,25 @@
// Emit totals by section name as additional "thread" events, sorted from
// longest one.
int Tid = 1;
- std::vector<NameAndDuration> SortedTotals;
- SortedTotals.reserve(TotalPerName.size());
- for (const auto &E : TotalPerName) {
- SortedTotals.push_back(E);
+ std::vector<NameAndCountAndDurationType> SortedTotals;
+ SortedTotals.reserve(CountAndTotalPerName.size());
+ for (const auto &E : CountAndTotalPerName) {
+ SortedTotals.push_back(std::pair<std::string, CountAndDurationType>
+ (E.getKey(), E.getValue()));
}
std::sort(SortedTotals.begin(), SortedTotals.end(),
- [](const NameAndDuration &A, const NameAndDuration &B) {
- return A.second > B.second;
+ [](const NameAndCountAndDurationType &A,
+ const NameAndCountAndDurationType &B) {
+ return A.second.second > B.second.second;
});
for (const auto &E : SortedTotals) {
- auto DurUs = duration_cast<microseconds>(E.second).count();
+ auto DurUs = duration_cast<microseconds>(E.second.second).count();
*OS << "{ \"pid\":1, \"tid\":" << Tid << ", \"ph\":\"X\", \"ts\":" << 0
<< ", \"dur\":" << DurUs << ", \"name\":\"Total "
<< escapeString(E.first)
- << "\", \"args\":{ \"count\":" << CountPerName[E.first]
- << ", \"avg ms\":" << (DurUs / CountPerName[E.first] / 1000)
- << "} },\n";
+ << "\", \"args\":{ \"count\":" << CountAndTotalPerName[E.first].first
+ << ", \"avg ms\":"
+ << (DurUs / CountAndTotalPerName[E.first].first / 1000) << "} },\n";
++Tid;
}
@@ -143,8 +147,7 @@
std::vector<Entry> Stack;
std::vector<Entry> Entries;
- std::unordered_map<std::string, DurationType> TotalPerName;
- std::unordered_map<std::string, size_t> CountPerName;
+ StringMap<CountAndDurationType> CountAndTotalPerName;
time_point<steady_clock> StartTime;
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60404.194123.patch
Type: text/x-patch
Size: 2971 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190408/82dd4004/attachment.bin>
More information about the llvm-commits
mailing list