Slowdown can point to busy-ness at two different levels. For years I’ve kept the Mac’s Activity Monitor open and watched memory levels, especially being one of those who only tends to re-boot/shutdown for OS upgrades. Now I use iStats Menu to watch for CPU load (normally transitory, e.g. app stuck in a busy loop) or memory load (something needs a close/re-open. Sadly, in current macOS eventually the OS’ ‘WindowServer’ process will consume loads of RAM and can only be re-started with a full reboot (boo, Apple).
At app level, the Agent & Rules Inspector is your friend. It is a bit gnomic, but it is a glimpse behind the curtain of the work you’ve—perhaps unintentionally—inflicted on your doc. For instance, if you’ve lots of agents, whose contents rarely/never change or need to run their actions, set them to ‘off’ ($AgentPriority, see the Query Inspector). Inactive agents retain their aliases—but don’t run actions on them—so can often be a good optimisation. Big rules (or edicts) can also be a roadblock. We write them, fix the issue then leave them running. Set via a prototype they can end up as unneeded code running on 000s of notes, all sucking ‘power’ from the app. Note: $RuleDisabled (and similar attributes for edicts, Display Expressions and Hover Expressions) are not inherited. Turning the rule off in a prototype does not affect inheriting notes†.
†. Whole extra topic, but if this is an issue and you need to explore how to toggle prototype-inherited Display Expression, Hover Expression , etc., on/off let’s start a new thread.