Earlier quoted context omitted.
> the company and/or the developers don’t see that, and shipped it slow (and presumably clean) instead That is a giant presumption.
It is slow, and I presume that’s because competent developers wrote it clean. It’s quite possible that it’s not clean either and was just written by developers incapable of performance or cleanliness. That possibility doesn’t detract from my argument - there’s no point in discussing performance or clean code with them if they’re incapable of either.
Do we update call stack and locals window at the same time, or do we update each one as early as possible but show inconsistent data?
Do we fetch call stack for all stopped threads, or do we wait until the user chooses to focus on a different thread/display all threads using Parallel Stacks windows?
If Watch result is a collection, do we load its members or wait for the user to expand the tree?
If call frame has changed, the strings in Watch need to be re parsed to refer to new variables. Do we do this work every time, or do we optimise for stepping in a single function? Is it worth it if only a few of the debugging engines can support that optimisation?
Each Watch needs to be interpreted in a way that catches all exceptions and creates an error message instead of crashing the debuggee.
If the user puts a breakpoint at the end of a loop and holds down F5, watching the Locals to decide when to switch to stepping, is that a supported use case?
These are the product decisions that lead to the performance, not micro details of how the code was laid out to achieve the goals. I mean, I don't have access to their source code, so I could still be proven wrong. What's an example of a fast debugger?