Author: teemperor Date: Wed Sep 4 04:40:29 2019 New Revision: 370879 URL: http://llvm.org/viewvc/llvm-project?rev=370879&view=rev Log: [lldb] Early exit in RangeDataVector:FindEntryIndexesThatContain
Summary: We currently spend a lot of time in this function (around 27% of the br-by-regex benchmark in lldb-bench) by just iterating over all the ranges. We already sorted these ranges by their base address, we we can actually just stop checking ranges as soon as we find one that has a higher base address. Reviewers: labath Reviewed By: labath Subscribers: amccarth, arphaman, JDevlieghere, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D67123 Modified: lldb/trunk/include/lldb/Utility/RangeMap.h Modified: lldb/trunk/include/lldb/Utility/RangeMap.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/RangeMap.h?rev=370879&r1=370878&r2=370879&view=diff ============================================================================== --- lldb/trunk/include/lldb/Utility/RangeMap.h (original) +++ lldb/trunk/include/lldb/Utility/RangeMap.h Wed Sep 4 04:40:29 2019 @@ -724,12 +724,14 @@ public: #ifdef ASSERT_RANGEMAP_ARE_SORTED assert(IsSorted()); #endif - - if (!m_entries.empty()) { - for (const auto &entry : m_entries) { - if (entry.Contains(addr)) - indexes.push_back(entry.data); - } + // Search the entries until the first entry that has a larger base address + // than `addr`. As m_entries is sorted by their base address, all following + // entries can't contain `addr` as their base address is already larger. + for (const auto &entry : m_entries) { + if (entry.Contains(addr)) + indexes.push_back(entry.data); + else if (entry.GetRangeBase() > addr) + break; } return indexes.size(); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits