clayborg requested changes to this revision. clayborg added a comment. This revision now requires changes to proceed.
We should probably store the stacks as lldb::addr_t values that are load addresses for quicker comparisons and searches. Inlined code details things more clearly. ================ Comment at: source/Commands/CommandObjectThread.cpp:76 + std::vector<uint32_t> m_thread_index_ids; + std::stack<Address> m_stack_frames; + }; ---------------- Might be more efficient to store a "std::stack<lldb::addr_t>" where you store the load address of each address. The comparisons would go quicker, not to mention the construction and destruction of stack itself. ================ Comment at: source/Commands/CommandObjectThread.cpp:146 + // Iterate over threads, finding unique stack buckets. + std::vector<UniqueStack> unique_stacks; + for (const lldb::tid_t &tid : tids) { ---------------- Add an operator function for UniqueStack that only compares the stack frames: ``` bool inline operator <(const UniqueStack &lhs, const UniqueStack &rhs) { return lhs.m_stack_frames < rhs.m_stack_frames; } ``` The comparison will be cheap when m_stack_frames is a std::stack of lldb::addr_t values. Then store as a std::set for efficient lookup later instead of a linear search. ================ Comment at: source/Commands/CommandObjectThread.cpp:204 + bool BucketThread(lldb::tid_t tid, + std::vector<UniqueStack>& unique_stacks, + CommandReturnObject &result) { ---------------- ``` std::set<UniqueSet> &unique_stacks; ``` ================ Comment at: source/Commands/CommandObjectThread.cpp:220-221 + const lldb::StackFrameSP frame_sp = thread->GetStackFrameAtIndex(frame_index); + const Address frame_address = frame_sp->GetFrameCodeAddress(); + stack_frames.push(frame_address); + } ---------------- ``` const lldb::addr_t pc = frame_sp->GetStackID().GetPC(); stack_frames.push(pc); ``` ================ Comment at: source/Commands/CommandObjectThread.cpp:226 + bool found_match = false; + for (UniqueStack& unique_stack : unique_stacks) { + if (unique_stack.IsEqual(stack_frames)) { ---------------- use fast std::set.find() so search for the matching value. https://reviews.llvm.org/D33426 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits