I'm adding two new classes that can be used to measure the duration of long tasks as process and thread level, e.g. decoding, fetching data from lldb-server, etc. In this first patch, I'm using it to measure the time it takes to decode each thread, which is printed out with the `dump info` command. In a later patch I'll start adding process-level tasks and I might move these classes to the upper Trace level, instead of having them in the intel-pt plugin. I might need to do that anyway in the future when we have to measure HTR. For now, I want to keep the impact of this change minimal. With it, I was able to generate the following info of a very big trace: ``` (lldb) thread trace dump info Trace technology: intel-pt thread #1: tid = 616081 Total number of instructions: 9729366 Memory usage: Raw trace size: 1024 KiB Total approximate memory usage (excluding raw trace): 123517.34 KiB Average memory usage per instruction (excluding raw trace): 13.00 bytes Timing: Decoding instructions: 1.62s Errors: Number of TSC decoding errors: 0 ``` As seen above, it took 1.62 seconds to decode 9.7M instructions. This is great news, as we don't need to do any optimization work in this area. Differential Revision: https://reviews.llvm.org/D123357
23 lines
619 B
C++
23 lines
619 B
C++
#include "TaskTimer.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
using namespace lldb_private::trace_intel_pt;
|
|
using namespace llvm;
|
|
|
|
void ThreadTaskTimer::ForEachTimedTask(
|
|
std::function<void(const std::string &event,
|
|
std::chrono::milliseconds duration)>
|
|
callback) {
|
|
for (const auto &kv : m_timed_tasks) {
|
|
callback(kv.first, kv.second);
|
|
}
|
|
}
|
|
|
|
ThreadTaskTimer &TaskTimer::ForThread(lldb::tid_t tid) {
|
|
auto it = m_thread_timers.find(tid);
|
|
if (it == m_thread_timers.end())
|
|
it = m_thread_timers.try_emplace(tid, ThreadTaskTimer{}).first;
|
|
return it->second;
|
|
}
|