[Lldb-commits] [PATCH] D150805: Proof of concept for reducing progress-reporting frequency.
Sterling Augustine via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Wed May 17 11:12:19 PDT 2023
saugustine created this revision.
Herald added subscribers: arphaman, kristof.beyls.
Herald added a project: All.
saugustine requested review of this revision.
Herald added a project: LLDB.
Herald added a subscriber: lldb-commits.
Reporting progress for every DIE read turns out to be very slow when
run over a remote connection such as ssh. We have a report of it
taking over 30-minutes to load the Dwarf for Chrome via ssh (which
transfers every single write) and only about a minute over
Chrome-Remote Desktop, which is a video-conferencing style link, and
so doesn't update nearly as often.
For a 7k DIE target, this improves the speed of reading on my personal
machine (entirely local) by about 3%; data below. Over remote, slower
connections the increase is likely much greater.
Top of trunk:
(lldb) target create "crash_test"
Current executable set to 'crash_test' (aarch64).
(lldb) log timers dump
12.509606661 sec (total: 12.510s; child: 0.000s; count: 7826) for void DWARFUnit::ExtractDIEsRWLocked()
...
With this change:
(lldb) target create "crash_test"
Current executable set to 'crash_test' (aarch64).
(lldb) log timers dump
12.139054862 sec (total: 12.139s; child: 0.000s; count: 7826) for void DWARFUnit::ExtractDIEsRWLocked()
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D150805
Files:
lldb/include/lldb/Core/Progress.h
lldb/source/Core/Progress.cpp
lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
Index: lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
===================================================================
--- lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
+++ lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
@@ -76,7 +76,8 @@
const uint64_t total_progress = units_to_index.size() * 2 + 8;
Progress progress(
llvm::formatv("Manually indexing DWARF for {0}", module_desc.GetData()),
- total_progress);
+ total_progress,
+ /*report_increment=*/ 1000);
std::vector<IndexSet> sets(units_to_index.size());
Index: lldb/source/Core/Progress.cpp
===================================================================
--- lldb/source/Core/Progress.cpp
+++ lldb/source/Core/Progress.cpp
@@ -16,9 +16,10 @@
std::atomic<uint64_t> Progress::g_id(0);
-Progress::Progress(std::string title, uint64_t total,
+Progress::Progress(std::string title, uint64_t total, uint64_t report_increment,
lldb_private::Debugger *debugger)
- : m_title(title), m_id(++g_id), m_completed(0), m_total(total) {
+ : m_title(title), m_id(++g_id), m_completed(0),
+ m_report_increment(report_increment), m_last_reported(0), m_total(total) {
assert(total > 0);
if (debugger)
m_debugger_id = debugger->GetID();
@@ -54,7 +55,11 @@
// Make sure we only send one notification that indicates the progress is
// complete.
m_complete = m_completed == m_total;
- Debugger::ReportProgress(m_id, m_title, std::move(update), m_completed,
- m_total, m_debugger_id);
+ if (m_complete || m_completed == 0 ||
+ m_completed >= m_last_reported + m_report_increment) {
+ m_last_reported = m_completed;
+ Debugger::ReportProgress(m_id, m_title, std::move(update), m_completed,
+ m_total, m_debugger_id);
+ }
}
}
Index: lldb/include/lldb/Core/Progress.h
===================================================================
--- lldb/include/lldb/Core/Progress.h
+++ lldb/include/lldb/Core/Progress.h
@@ -67,9 +67,13 @@
/// set to UINT64_MAX then an indeterminate progress indicator should be
/// displayed.
///
+ /// @param [in] report_increment Notify only when progress has exceeded
+ /// this amount. Throttles messaging.
+ ///
/// @param [in] debugger An optional debugger pointer to specify that this
/// progress is to be reported only to specific debuggers.
Progress(std::string title, uint64_t total = UINT64_MAX,
+ uint64_t report_increment = 1,
lldb_private::Debugger *debugger = nullptr);
/// Destroy the progress object.
@@ -101,6 +105,10 @@
const uint64_t m_id;
/// How much work ([0...m_total]) that has been completed.
uint64_t m_completed;
+ /// Print a message when progress exceeds this amount.
+ uint64_t m_report_increment;
+ /// Progress at the time of last message.
+ uint64_t m_last_reported;
/// Total amount of work, UINT64_MAX for non deterministic progress.
const uint64_t m_total;
/// The optional debugger ID to report progress to. If this has no value then
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D150805.523118.patch
Type: text/x-patch
Size: 3125 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20230517/7f8faff7/attachment.bin>
More information about the lldb-commits
mailing list